2011-08-06 3 views
1

Est-il possible que certains appels publishProgress manqués par onProgressUpdate? Je veux dire est-il possible qu'il y ait un transfert manqué entre les rappels doInBackground et onProgressUpdate avec l'utilisation de l'appel publishProgress. Parce que je vois ça.onProgressUpdate manque certains publie

class DoSomething extends AsyncTask Void, String, Void { 
    String[] S = new String[] {"a", "b", "c", "d"}; 

    void doInBackground(Void... ps) { 

    for(String s : S) {  
     publishProgress(s); 
    } 
    } 

    void onProgressUpdate(String... vs) { 

    Log.d("", vs[0]); 
} 

Qu'est-ce que je rencontre qui en résulte

a b b d


ce qui se passe à c?
Note: Ceci est juste une illustration de mon application, et cela arrive parfois (pas du tout), je ne pouvais pas écrire tous les codes ici parce que c'est trop compliqué. Mais en résumé, cela arrive.
Alors, des idées?

Répondre

6

Ok. J'ai creusé profondément et trouvé la réponse que: la transmission de message entre doInBackground et onProgressUpdate n'est pas en série qui est asynchrone (du nom de classe de base). Tout appel dans doInBackground avec publishProgress(xx) atteindra éventuellement onProgressUpdate mais pas one-to-one.
Par exemple, la démonstration très factice:

doInBackgroud() { 
String s; 
for(i=1 to 10) { 
    s = i.toString(); 
    publishProgress(s); 
    } 
} 

onProgressUpdate(String par) { 
Log.d(par); 
} 

peut être le résultat que: 1 2 2 3 4 5 5 5 6 7
Qu'est-ce que tha? Ne vous inquiétez pas, nous envoyons la variable locale s (in doinback.) Par référence et par le temps onProgressUpdate invoqué et il enregistre sa valeur, il est probable que doInBackground change la valeur de s. Cela entraîne une valeur inattendue dans le onProgressUpdate. Mais tous les appels publishProgress invoquent la méthode onProgressUpdate.
Si nous écrit:

doInBackgroud() { 

for(i=1 to 10) { 
    String s = i.toString(); 
    publishProgress(s); 
    } 
} 

onProgressUpdate(String par) { 
Log.d(par); 
} 

cette fois-ci dans des conditions normales, le résultat doit être: 1 2 3 4 5 6 7 8 9 10
et c'est ce que nous attendons, non?
s'il y a une meilleure idée, je voudrais entendre que
Et tous les commentaires seront les bienvenus.
Note: Peut-être trop simple, mais j'ai sauvé ma semaine.

Questions connexes