onProgressUpdate пропускает некоторые публикации - PullRequest
1 голос
/ 06 августа 2011

Возможно ли, что некоторые вызовы publishProgress пропущены onProgressUpdate? Я имею в виду, возможно ли, что может быть одна ошибка передачи между обратными вызовами doInBackground и onProgressUpdate с использованием вызова publishProgress. Потому что я вижу это.

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]);
 }

С чем я сталкиваюсь в результате

a b b d


что происходит с c?
Примечание: Это просто иллюстрация моего приложения, и это иногда случается (не выполняется вообще), я не мог написать все коды здесь, потому что это слишком сложно. Но в итоге это происходит.
Так есть идеи?

1 Ответ

6 голосов
/ 07 августа 2011

Хорошо. Я углубился и нашел ответ, что: передача сообщений между doInBackground и onProgressUpdate не является последовательной, то есть асинхронной (из имени базового класса). Любой вызов в doInBackground с publishProgress(xx) в конечном итоге достигнет onProgressUpdate, но не один к одному.
Например, очень фиктивная демонстрация:

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

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

может быть результатом как: 1 2 2 3 4 5 5 5 6 7
Что это? Не волнуйтесь, мы отправляем локальную переменную s (в doinback.) По ссылке, и к моменту вызова onProgressUpdate и регистрации его значения, существует вероятность того, что doInBackground изменит значение s. Это приводит к неожиданному значению в onProgressUpdate. Но все вызовы publishProgress вызывают метод onProgressUpdate.
Если бы мы написали:

doInBackgroud() {

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

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

на этот раз при нормальных условиях результат должен быть: 1 2 3 4 5 6 7 8 9 10
и это то, что мы ожидаем, не так ли?
если есть идея получше, я бы хотел услышать, что
И любые комментарии будут приветствоваться.
Примечание: Возможно, слишком простой случай, но спас мою неделю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...