Italian Chiacchiericci

LucaMs

Expert
Licensed User
Longtime User
La cosa più corretta sarebbe addirittura caricare sia i contatti che la xCLV ad ogni Activity_Resume (perché non puoi sapere se l'utente metta in pausa la tua app, modifichi la lista contatti dello smartphone, per poi riattivare la tua app).

asincrona
Spesso trovo le funzionalità asincrone inutii, come in questo caso: a che serve che sia asincrona se tanto non carichi la xCLV finché non hai letto tutti i contatti?

In oltre o visto il codice di erel e non mi piace che elimina le "celle" che diventano invisibili
Non è obbligatorio usare questa parte del codice; lo fa nel caso in cui tu abbia molte centinaia di elementi da visualizzare.
 

LucaMs

Expert
Licensed User
Longtime User
La cosa più corretta sarebbe addirittura caricare sia i contatti che la xCLV ad ogni Activity_Resume (perché non puoi sapere se l'utente metta in pausa la tua app, modifichi la lista contatti dello smartphone, per poi riattivare la tua app).
In questo caso, meglio prevedere un tasto "Aggiorna", altrimenti caricare ogni volta tutto da resume sarebbe un'enorme perdita di tempo.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
la farei asincrona perche altrimenti potrei avere dei lag (perdita di tempo) fastidiosi, invece caricando in maniera asincrona la app va avanti , magari con un animazione di benvenuto, e non mi accorgo che sta "perdendo" tempo a caricare, un po come ho fatto con la libreria vocabolario
 

LucaMs

Expert
Licensed User
Longtime User
la farei asincrona perche altrimenti potrei avere dei lag (perdita di tempo) fastidiosi, invece caricando in maniera asincrona la app va avanti , magari con un animazione di benvenuto, e non mi accorgo che sta "perdendo" tempo a caricare, un po come ho fatto con la libreria vocabolario
Ok ma, in generale, usare metodi asincroni può essere utile ma se devi subito dopo accedere a dati creati-recuperati da quel metodo, come nel caso di caricamento della xCLV, è del tutto inutile (a meno che poi non usi tecniche particolari per il caricamento della xCLV, come quel "lazy").
 

LucaMs

Expert
Licensed User
Longtime User
Fatto una provetta (mi ha fatto faticare più del previsto, ANCHE perché devo avere un contatto corrotto sul mio smartphone - no, non una persona corrotta... magari :p).

Non è granché, giusto per provare.

@Sagenut, fammi sapere se funziona sul tuo smartphone (compilala, non in debug mode, in release) e se sia sufficientemente veloce.
 

Attachments

  • Contatti.zip
    21 KB · Views: 179

Sagenut

Expert
Licensed User
Longtime User
Non sò se riuscirò a provare il tuo esempio oggi.
E comunque non riuscirò a farlo prima di sera/notte.
Nel frattempo ti ringrazio.
 

Sagenut

Expert
Licensed User
Longtime User
@LucaMs............ho provato il tuo esempio.
Mi pare che funzioni decisamente meglio del mio.
Impiega circa 2-3 secondi prima che appaia l'activity con la lista contatti.
Quindi torna con i calcoli che avevi fatto tu, anche se gli item non sono così complicati come nell'esempio di Erel.
Ho solo modificato il tuo codice per la richiesta del permesso perchè da me non funzionava e l'app crashava perchè tentava di accedere senza avere effettivamente il permesso.
In pratica mi pare di capire che hai implementato quel famoso Lazy Loading, no?
Ti mostro come ho modificato la parte di richiesta del permesso.
L'ho semplificata molto evitando il MsgBox solo per provare immediatamente il tuo esempio.
PRIMA
B4X:
Sub btnContacts_Click
    ' TODO perfezionare
    If mPermitGranted Then
        Activity_PermissionResult (rp.PERMISSION_READ_CONTACTS, True)
    Else
        Msgbox2Async("Permetti a quest'app di accedere ai contatti?", "Accesso ai contatti", "Sì", "", "No", Null, False)
        Wait For Msgbox_Result (Result As Int)
        Activity_PermissionResult(rp.PERMISSION_READ_CONTACTS, (Result = DialogResponse.POSITIVE))
    End If
End Sub

Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    If Permission = rp.PERMISSION_READ_CONTACTS Then
        mPermitGranted = result
        If result Then
            StartActivity(actContacts)
        Else
            ' TODO chiudere l'app
        End If
    End If
End Sub
DOPO
B4X:
Sub btnContacts_Click
    ' TODO perfezionare
'    If mPermitGranted Then
'        Activity_PermissionResult (rp.PERMISSION_READ_CONTACTS, True)
'    Else
'        Msgbox2Async("Permetti a quest'app di accedere ai contatti?", "Accesso ai contatti", "Sì", "", "No", Null, False)
'        Wait For Msgbox_Result (Result As Int)
'        Activity_PermissionResult(rp.PERMISSION_READ_CONTACTS, (Result = DialogResponse.POSITIVE))
'    End If
    rp.CheckAndRequest ("android.permission.READ_CONTACTS")
    wait for Activity_PermissionResult (Permission As String, result As Boolean)
    If result Then
        StartActivity(actContacts)
    End If
End Sub
'Sub Activity_PermissionResult (Permission As String, Result As Boolean)
'    If Permission = rp.PERMISSION_READ_CONTACTS Then
'        mPermitGranted = result
'        If result Then
'            StartActivity(actContacts)
'        Else
'            ' TODO chiudere l'app
'        End If
'    End If
'End Sub
Grazie!
P.S.=io uso B4A 8.00 e non ho installato il 8.30 Beta che invece credo che tu abbia usato per l'esempio, o sbaglio?
 

LucaMs

Expert
Licensed User
Longtime User
Impiega circa 2-3 secondi prima che appaia l'activity con la lista contatti.
Dato che già non ricordo :D:(... forse si può far comparire l'activity subito, ovviamente senza i contatti già caricati.

Ho solo modificato il tuo codice per la richiesta del permesso perchè da me non funzionava e l'app crashava perchè tentava di accedere senza avere effettivamente il permesso.
Infatti non so bene come funzioni la cosa; fatta al volo, senza perderci altro tempo ma dovrò guardare meglio (iniziando dalla tua modifica).
 

Sagenut

Expert
Licensed User
Longtime User
Semplicemente aspetto la Final perchè al momento avendo poco codice e poca esperienza non mi sento di mettermi a cercare Bug che poi potrebbero benissimo essere errori miei.
Comunque non credo abbia fatto differenza in questo esempio.
 

LucaMs

Expert
Licensed User
Longtime User
Ah, ok, quasi certamente dipendono da uno o più contatti "corrotti" sul mio smartphone (fammi sapere se anche tu hai dei messaggi d'errore nella Log).
Ho dovuto aggiungere:
B4X:
If Phone <> "0" Then 'ignore
    MyContact.PhoneNumber = Phone.Number
End If
subito dopo:
B4X:
Dim Phone As cuPhone = lstPhones.Get(0)

[Il nome di quella variabile, "Phone", andrebbe cambiato; probabilmente interferirebbe con la libreria Phone, se utilizzata]
 

Sagenut

Expert
Licensed User
Longtime User
In esecuzione in Release sul mio device tramite B4A Bridge non mi dà errori:
--------- beginning of main
*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
sending message to waiting queue (activity_permissionresult)
running waiting messages (1)
** Activity (main) Resume **
** Activity (main) Pause, UserClosed = false **
** Activity (actcontacts) Create, isFirst = true **
** Activity (actcontacts) Resume **
Senza applicare la tua ultima modifica.
 

LucaMs

Expert
Licensed User
Longtime User
Un modo più semplice per richiedere il permesso:

B4X:
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("layMain")

    rp.CheckAndRequest(rp.PERMISSION_READ_CONTACTS)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    If Not(Result) Then
        Msgbox("Non hai concesso il permesso...", "Accesso ai contatti nella rubrica")
        ' TODO chiudere l'app
    End If
End Sub

Niente altro, nemmeno la routine-evento Activity_PermissionResult.
 

Sagenut

Expert
Licensed User
Longtime User
Anche nel mio esempio quella parte era tutta commentata. :D
La avevo lasciata per farti vedere che non è necessaria.......forse può tornare comoda per gestire il flusso in altri modi.
Comunque mi rendo conto sempre di più che avventurarsi nel mondo delle App Android è proprio una bella avventura.
Poi penso che lo faccio per il gusto del Nulla e mi domando se sono una persona normale. o_O
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Se stasera dopo lavoro non sarò troppo zombizzato proverò a migliorare la mia faccenda Contatti.
 
Top