Хорошо. Я углубился и нашел ответ, что: передача сообщений между 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
и это то, что мы ожидаем, не так ли?
если есть идея получше, я бы хотел услышать, что
И любые комментарии будут приветствоваться.
Примечание: Возможно, слишком простой случай, но спас мою неделю.