Italian [RISOLTO] B4A - B4XLoadingIndicator mentre carica il database

3uowiS

Active Member
Licensed User
Buonasera a tutti, durante il caricamento del database (circa 5 secondi) vorrei mettere il Loading Indicator.
Ho letto questo thread e quello di Erel, ho provato a metterlo come nell'esempio di @LucaMs ma non funziona come vorrei, l'animazione si vede solo una frazione di secondo prima di aver terminato il caricamento.
Penso che il problema sia dato dal fatto che i 5 secondi ce li mette proprio per caricare il layout.
Così ho provato creando un altro layout con solo il B4XLoadingIndicator da caricare prima di "Database" (so che poi i layout si sovrappongono), mettendo anche uno "Sleep(200)" sempre prima di "Activity.LoadLayout("Database")". In questo modo sembra funzionare perché parte l'animazione prima del caricamento, solo che caricando il database l'animazione si blocca.

C'è un modo migliore per inserirlo?

Questo è il codice che ho in Activity Create:
B4X:
Sub Activity_Create(firstTime As Boolean)
    
    Activity.LoadLayout("Database")
    
    Dim rs As ResultSet
    rs = Starter.sqlPlayers.ExecQuery("SELECT ID, PlayerName, Pos1, Pos2, Team, GEN from PLAYERS ORDER BY GEN DESC")
    fill_clv (rs)
    rs.Close
    
End Sub

Grazie in anticipo a tutti!
 

Xfood

Expert
Licensed User
io utilizzo questo

B4X:
ProgressDialogShow("Caricamento in Corso ...")
' fai quello che ti serve
Dim rs As ResultSet
rs = Starter.sqlPlayers.ExecQuery("SELECT ID, PlayerName, Pos1, Pos2, Team, GEN from PLAYERS ORDER BY GEN DESC")
fill_clv (rs)
rs.Close
B4X:
' e alla fine

ProgressDialogHide
 
Last edited:

Sagenut

Well-Known Member
Licensed User
Longtime User
Secondo me puoi mettere la view del B4Xloadingindicator già nel Layout Database e la tieni nascosta con il suo metodo Hide.
Quando ti serve mostrarla usi il metodo Show, e poi di nuovo Hide quando non ti serve più.
Comunque è meglio evitare di mettere codice importante in Activity_Create.
Crea una Sub e richiamala come ultimo comando.
Inoltre ricorda che subito dopo la Create viene eseguita la Resume.
Queste sono anche complicazioni perché vengono rieseguite se la tua app viene messa in secondo piano e poi riaperta.
Dovresti approcciare le B4XPages che risolvono molti problemi, soprattutto sul comportamento del ciclo vitale del processo delle app.
 
Last edited:

3uowiS

Active Member
Licensed User
Grazie @Xfood, se non riuscirò ad usare B4Xloadingindicator userò questo metodo! ;)


Dovresti approcciare le B4XPages che risolvono molti problemi, soprattutto sul comportamento del ciclo vitale del processo delle app.
Allora mi informerò sulle B4XPages, grazie mille per l'informazione.

Secondo me puoi mettere la view del B4Xloadingindicator già nel Layout Database e la tieni nascosta con il suo metodo Hide.
Quando ti serve mostrarla usi il metodo Show, e poi di nuovo Hide quando non ti serve più.
Comunque è meglio evitare di mettere codice importante in Activity_Create.
Crea una Sub e richiamala come ultimo comando.
E' esattamente come avevo fatto nella prima prova, la view del B4Xloadingindicator nel Layout Database e la query dentro la sub Load come nell'esempio di @LucaMs, ma la visualizzava solo mezzo secondo prima di aver finito il caricamento.
Non so se ho sbagliato qualcosa, avevo fatto così:
B4X:
Sub Activity_Create(firstTime As Boolean) 
    Activity.LoadLayout("Database")
    Sleep(100)
    B4XLoadingIndicator1.Show
    Load
    Wait For Loading_Completed
    B4XLoadingIndicator1.Hide
    
End Sub

Sub Load
    Dim now As Long = DateTime.Now
    Do Until DateTime.Now - now >= 3 * DateTime.TicksPerSecond
        Dim rs As ResultSet
        rs = Starter.sqlPlayers.ExecQuery("SELECT ID, PlayerName, Pos1, Pos2, Team, GEN from PLAYERS ORDER BY GEN DESC")
        fill_clv (rs)
        rs.Close
    Loop
  
    CallSubDelayed(Me, "Loading_Completed")
  
End Sub
 

Xfood

Expert
Licensed User
Nel tuo caso, io metterei
B4XLoadingIndicator1.Hide
Dopo questa istruzione


CallSubDelayed(Me, "Loading_Completed")
B4XLoadingIndicator1.Hide
 

Sagenut

Well-Known Member
Licensed User
Longtime User
Prova così
B4X:
Sub Activity_Create(firstTime As Boolean)
    Activity.LoadLayout("Database")
    Load
    Wait For Loading_Completed
End Sub

Sub Load
    B4XLoadingIndicator1.Show
    Sleep(0)
    Dim rs As ResultSet
    rs = Starter.sqlPlayers.ExecQuery("SELECT ID, PlayerName, Pos1, Pos2, Team, GEN from PLAYERS ORDER BY GEN DESC")
    fill_clv (rs)
    rs.Close
    B4XLoadingIndicator1.Hide
    CallSubDelayed(Me, "Loading_Completed")
End Sub
Ho rimosso quel ciclo Do - Loop perchè non ne capivo il senso.
In pratica ripeteva in continuazione quelle istruzioni per 3 secondi.
Nell'esempio di @LucaMs quel ciclo serviva a simulare il lavoro di query al DB.......ma tu lo fai per davvero quindi quel ciclo non dovrebbe servire.
Altra domanda:
prima di tentare di mettere il B4ALoadingIndicator quanto impiegava la tua query per popolare la CLV?
Perchè se il lavoro è quasi istantaneo è anche normale che l'indicatore appaia per pochissimo.
 

3uowiS

Active Member
Licensed User
Grazie @Sagenut! Ora sono fuori, dopo lo provo.
Intanto ti dico che ci metteva circa 4/5 secondi. L'indicatore appariva per una frazione di secondo dopo 4 secondi di schermata bianca.
 

LucaMs

Expert
Licensed User
Longtime User
L'ultimo codice di @Sagenut potrebbe non funzionare bene, perché l'Activity_Create contiene un Wait For, il che fa passare subito all'esecuzione dell'Activity_Resume.
Se in quest'ultima non c'è sorgente, non dovrebbero esserci problemi.

Puoi chiamarla usando CallSubDelayed(Me, "Load").

B4X:
Sub Activity_Create(firstTime As Boolean)
    Activity.LoadLayout("Database")
    CallSubDelayed(Me, "Load")
End Sub


[Se stai usando le B4XPages, cosa consigliatissima, sarebbe meglio non scrivere codice nell'Activity Main]
 

Sagenut

Well-Known Member
Licensed User
Longtime User
Essendo poi l'ultima istruzione il wait for non serviva davvero.
 

3uowiS

Active Member
Licensed User
L'ultimo codice di @Sagenut potrebbe non funzionare bene, perché l'Activity_Create contiene un Wait For, il che fa passare subito all'esecuzione dell'Activity_Resume.
Se in quest'ultima non c'è sorgente, non dovrebbero esserci problemi.

Puoi chiamarla usando CallSubDelayed(Me, "Load").

B4X:
Sub Activity_Create(firstTime As Boolean)
    Activity.LoadLayout("Database")
    CallSubDelayed(Me, "Load")
End Sub
Grazie mille, non mi avvia l'animazione lo stesso, ma con CallSubDelayed(Me, "Load") carica molto meglio perché almeno adesso intanto apre il layout e una messagebox che ho aggiunto, poi arriva la customlistview, invece di rimanere tutta la schermata bianca per 4/5 secondi, quindi sembra che faccia prima.
Una domanda, te lo chiedo per imparare le dinamiche, in CallSubDelayed(Me, "Load") Me cosa sarebbe?

[Se stai usando le B4XPages, cosa consigliatissima, sarebbe meglio non scrivere codice nell'Activity Main]
Scusa la domanda banale, ma con Activity Main intendi l'Activity Create?
 

LucaMs

Expert
Licensed User
Longtime User
Una domanda, te lo chiedo per imparare le dinamiche, in CallSubDelayed(Me, "Load") Me cosa sarebbe?
Me, ovunque lo userai, indica "l'oggetto in cui stai scrivendo". Infatti, quale routine "Load" viene lanciata da quel comando CallSubDelayed? Quella interna al "luogo" in cui ti trovi. "luogo", perché potresti stare scrivendo il codice sorgente di una classe, ad esempio.

Scusa la domanda banale, ma con Activity Main intendi l'Activity Create?
Activity_Create è una routine (qui tutti le chiamano Sub; a me non piace, ma insomma quello è) e più precisamente è una routine-evento, nel senso che scatta, va in esecuzione quando si verifichi un determinato evento (in questo caso quando l'Activity venga creata, a runtime).
Activity Main è la Activity di nome Main, quella il cui codice sorgente ti trovi subito davanti quando crei un nuovo progetto (non un nuovo progetto B4XPages; in questo caso il sorgente che ti troveresti davanti sarebbe quello della prima pagina, la pagina di default del progetto, la B4XMainPage, ma l'Activity Main ci sarebbe ugualmente).

Dopo averti consigliato di leggere la documentazione, altrimenti ti perderai di sicuro, se non sa nemmeno cosa sia un'Activity, possiamo dire che, più o meno, un'Activity corrisponde ai Form (di VB6/VB Net o di B4J).
 
Last edited:

Sagenut

Well-Known Member
Licensed User
Longtime User
Difficile capire perché non ti mostri subito il loading indicator.
Puoi allegare il tuo progetto completo?
O ci sono dati privati?
 

3uowiS

Active Member
Licensed User
Ho provato anche con il metodo di @Xfood (ProgressDialog) e non mi visualizza nemmeno quello! Alla fine ho risolto perché visto che grazie a CallSubDelayed mi carica il layout, ho inserito quindi una semplice Label con scritto "Caricamento in corso..." che poi nascondo appena ha caricato. Non sarà professionale ma comunque serve allo scopo di avvisare che sta caricando. ;)
 

3uowiS

Active Member
Licensed User
Me, ovunque lo userai, indica "l'oggetto in cui stai scrivendo". Infatti, quale routine "Load" viene lanciata da quel comando CallSubDelayed? Quella interna al "luogo" in cui ti trovi. "luogo", perché potresti stare scrivendo il codice sorgente di una classe, ad esempio.


Activity_Create è una routine (qui tutti le chiamano Sub; a me non piace, ma insomma quello è) e più precisamente è una routine-evento, nel senso che scatta, va in esecuzione quando si verifichi un determinato evento (in questo caso quando l'Activity venga creata, a runtime).
Activity Main è la Activity di nome Main, quella il cui codice sorgente ti trovi subito davanti quando crei un nuovo progetto (non un nuovo progetto B4XPages; in questo caso il sorgente che ti troveresti davanti sarebbe quello della prima pagina, la pagina di default del progetto, la B4XMainPage, ma l'Activity Main ci sarebbe ugualmente).

Dopo averti consigliato di leggere la documentazione, altrimenti ti perderai di sicuro, se non sa nemmeno cosa sia un'Activity, possiamo dire che, più o meno, un'Activity corrisponde ai Form (di VB6/VB Net o di B4J).
Ah... si si, capito! Sapevo che si chiamava Main ma lì per lì non capivo perché ti riferivi alla Main dato che i codici in questione erano su un'altra Activity (ovviamente te non potevi saperlo però 😅) quindi credevo che intendessi altro. Faccio un po' di confusione con le terminologie... 😬

Difficile capire perché non ti mostri subito il loading indicator.
Puoi allegare il tuo progetto completo?
O ci sono dati privati?
Nessun problema a metterlo, sistemo un paio di cose e lo allego.
 

Sagenut

Well-Known Member
Licensed User
Longtime User
File RAR?
Per esportare un progetto devi, da dentro B4A, cliccare sull'icona a forma di pacchetto regalo.
Ti crea lo ZIP con tutto il tuo progetto (questo vale solo se non usi le B4XPages, altrimenti il metodo è diverso).
Il tuo file da 5 mega che ne viene fuori dovrai metterlo sul tuo Google Drive, Dropbox o simili e condividere il link per poterlo scaricare.
 

LucaMs

Expert
Licensed User
Longtime User
@Sagenut non mi allega il file rar con tutta la cartella dicendo che è troppo grande (4,5MB). Come devo fare?
Qui il massimo che puoi allegare è di 500kb.
Hai 4 possibilità:

1 - provare ad eliminare eventuali file "pesanti" (immagini, di solito)
2 - mettere il progetto su una tua "nuvoletta", rendendolo disponibile (Google Drive, ad esempio)
3 - creare un progetto praticamente identico ma di prova, con il minimo indispensabile
4 - me lo so' dimenticato 😄
 

Sagenut

Well-Known Member
Licensed User
Longtime User
Poi ti lascio nelle mani di @LucaMs e di tutti gli altri volenterosi, perchè io potrò tornare al pc solo questa sera molto tardi. ;)
 
Top