Hola, soy Miguel, llevo algún tiempo consultando cosas por aqui, pero nunca habia preguntado.
Tengo un problema, espero podais ayudarme.
Estoy recuperando la información de los contactos con la libreria Contacts2,
B4X:
Dim Contacts2 As Contacts2
Dim listOfContacts As List
listOfContacts = Contacts2.GetAll(True,False)
If listOfContacts.Size > 0 Then
PanelContacts.Visible = True
DoEvents
Dim i as Int
For i = 0 To listOfContacts.Size - 1
Dim pc As Int
pc = (i * 100) / listOfContacts.Size
If pc > 100 Then
PbContacts.Progress = 100
Else
PbContacts.Progress = pc
End If
Dim Contact As Contact
Contact = listOfContacts.Get(i)
' Log(Contact) 'will print the fields to the LogCat
Dim emails As Map
emails = Contact.GetEmails
' If emails.Size > 0 Then Log("Email addresses: " & emails)
Dim phones As Map
phones = Contact.GetPhones
' If phones.Size > 0 Then Log("Phone numbers: " & phones)
' DoEvents
Next
PanelContacts.Visible = False
end if
El problema es que si no pongo el doevents despues de cada registro la progressbar (PbContacts) no se actualiza y al usuario puede parecerle que la aplicación este frita. (por lo que he leido no es bueno utilizar doevents tantas veces)
Que puedo hacer para mostrarle algo al usuario sin utilizar Doevents ?
DoEvents debe ser utilizado cuando usas un loop que va a durar mucho tiempo, la razon es para evitar el "App not responding" error, en este caso, debes poner solo 1 DoEvents dentro de tu For...Next
B4X:
...
For i = 0 To listOfContacts.Size - 1
Doevents
...
DoEvents permite que el UI sea actualizado, en este caso, de no poner DoEvents tu ProgressBar no se actualiza.
Si, asi es como lo habia hecho, en el codigo que he mandado el doevents esta comentado,
La duda es que, si por ejemplo hay 1000 contactos, si es recomendable que se hagan 1000 doevents ? o si seria mejor hacer un doevents cada 10% o 20 %, etc
DoEvents ralentiza mucho la operación, por lo tanto es mejor hacerlo no en cada iteración. Puedes llamarlo cada X iteraciones, o también creando un timer para que cada medio segundo lo llame...