Italian [RISOLTO] B4A - B4XLoadingIndicator mentre carica il database

Sagenut

Expert
Licensed User
Longtime User
@3uowiS
Ricorda che la velocità effettiva di un codice si valuta installando in RELEASE e non in DEBUG.
Molte cose sono più lente in DEBUG.
 

LucaMs

Expert
Licensed User
Longtime User
L'animazione adesso funziona solo che ci mette molto di più a caricare
In effetti è dovuto allo Sleep(0) eseguito ad ogni creazione item.

Potresti eseguirlo (lo Sleep) ogni N item caricati, ovvero usare un contatore dichiarato prima del Do While, diciamo chiamato Count, e poi all'interno del Do While:

If Count Mod 10 = 0 Then Sleep(0)

Ovviamente incrementando sempre Count.

Altre cose che probabilmente rallentano:

xclv.AsView.Width / 6

perché calcolarlo ogni volta? Farlo una sola volta, prima del Do While, mettendone il valore in una variabile ed usare quella.

Anche questa parte:
B4X:
        If gen >0 And gen <10 Then
            lblGen.Color = Colors.White
        Else if gen >9 And gen <20 Then
            lblGen.Color = Colors.RGB(205,127,50)
        Else if gen >19 And gen <30 Then
            lblGen.Color = Colors.RGB(192,192,192)
        Else if gen >29 And gen <40 Then
            lblGen.Color = Colors.RGB(252,194,0)
        Else
            lblGen.Color = Colors.Red
        End If

1 - crea delle variabili per i colori; non è improbabile che la funzione RGB impieghi tempo
2 - usare una select anziché tanti if - meglio ancora sarebbe memorizzare in qualche modo i colori, in un array o simili (map) ma al momento non mi scatta la scintilla
 

Sagenut

Expert
Licensed User
Longtime User
Il suo layout per l'Item della CLV ha dimensione 300x50.
Prima dava l'altezza dell'item dopo aver caricato il layout e prendendo l'altezza del panel del layout.
Visto che c'è un rapporto fisso di 1/6 ho fatto così per poter dare subito la dimensione al panel e rimuovere anche il warning del Panel Size Unknown, benchè non sia un errore e non crea problemi.
 

LucaMs

Expert
Licensed User
Longtime User
Prova così (in modalità Release):

B4X:
Sub fill_clv (rs As ResultSet) As ResumableSub
    xclv.Clear

    Dim mapColors As Map
    mapColors.Initialize
    mapColors.Put(0, Colors.White)
    mapColors.Put(1, Colors.RGB(205,127,50))
    mapColors.Put(2, Colors.RGB(192,192,192))
    mapColors.Put(3, Colors.RGB(252,194,0))
    Dim ColorIndex As Int
   
    Dim Height As Int = xclv.AsView.Width / 6
   
    Dim Count As Int
   
    Do While rs.NextRow
        If Count Mod 10 = 0 Then
            Sleep(0) 'Questo Sleep serve per evitare che l'animazione del Loading Indicator si blocchi
        End If
        Count = Count + 1
       
        Dim p As B4XView = xui.CreatePanel("")
        p.SetLayoutAnimated(0,0,0,xclv.AsView.Width, Height)    'Il tuo layout ha una misura precisa e si vedeva che l'altezza era 1/6
                                                                            'della larghezza. Quindi puoi definire subito la misura del panel
                                                                            'per evitare il warning del Panel Size Unknown
        p.LoadLayout("playerDb")
       
       
        lblName.Text = rs.GetString("PlayerName")
        lblPos1.Text = rs.GetString("Pos1")
        lblPos2.Text = rs.GetString("Pos2")
        If lblPos2.Text = "null" Then
            lblPos2.Text = ""
        End If
        lblTeam.Text = rs.GetString("Team")
        lblGen.Text = rs.GetInt("GEN")
        Dim gen As Int = rs.GetInt("GEN")

'        If gen >0 And gen <10 Then
'            lblGen.Color = Colors.White
'        Else if gen >9 And gen <20 Then
'            lblGen.Color = Colors.RGB(205,127,50)
'        Else if gen >19 And gen <30 Then
'            lblGen.Color = Colors.RGB(192,192,192)
'        Else if gen >29 And gen <40 Then
'            lblGen.Color = Colors.RGB(252,194,0)
'        Else
'            lblGen.Color = Colors.Red
'        End If

        ColorIndex = gen / 10

        If ColorIndex < 4 Then
            lblGen.Color = mapColors.Get(ColorIndex)
        Else
            lblGen.Color = Colors.Red
        End If

       
        xclv.Add(p, rs.GetString("ID"))
    Loop
   
    rs.Close
   
    Return True
End Sub

Per evitare quei warning, mettere Return True (o False, non ha importanza) prima di End Sub nelle routine di tipo Resumable (quindi anche alla fine della routine Load).
 

Sabotto

Well-Known Member
Licensed User
Queste sono le classiche discussioni per rispondere ad un quesito dove davvero si impara tantissimo da chi ha piu esperienza. Soprattutto perchè c'è un codice su cui ragionare. Tranquillo, 3uowiS, non voglio rubarti nulla, ma per me questo thread è meglio di un capitolo di un libro su B4A, con gli spunti e le riflessioni dei due guroni (guru grandi si scrive cosi? Boh? LucaMs tu che sei un fine dicitore correggimi). :p.
 

LucaMs

Expert
Licensed User
Longtime User
non voglio rubarti nulla,
@Sabotto, devi sapere che sono un gran rompiballe, soprattutto non sopporto gente in TV che non conosca l'italiano (ovvero il 95% di queste persone).

"non voglio rubarti nulla", se ci pensi, significa che qualcosa vuoi rubargli!
"NON" vuoi rubare "NULLA", quindi vuoi rubare "QUALCOSA" ?
(due negazioni affermano).

Non era per riprenderti, visto che tanto tutti noi la mettiamo in quel modo; era solo per mettere in guardia @3uowiS ?
 

Sagenut

Expert
Licensed User
Longtime User
Pong
Pong.png
 
Top