有没有可能onprogressupdate错过了一些publishprogress调用?我的意思是,使用publishprogress调用可能会在doinbackground和onprogressupdate回调之间发生一次传输失败。因为我看到了。
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]);
}
我遇到了什么导致了B,B,D,C呢?
注意:这只是我的应用程序的一个例子,有时会发生这种情况(根本不运行),我不能在这里编写所有的代码,因为它太复杂了。但总的来说,这种情况正在发生。
有什么想法吗?
最佳答案
好啊。我深入研究,发现答案是:doInBackground
和onProgressUpdate
之间的消息传输不是异步的串行的(从基类名称)。任何带有doInBackground
的呼叫都将最终到达publishProgress(xx)
而不是一对一。
例如,非常虚拟的演示:
doInBackgroud() {
String s;
for(i=1 to 10) {
s = i.toString();
publishProgress(s);
}
}
onProgressUpdate(String par) {
Log.d(par);
}
结果可能是:1 2 3 4 5 5 6 7
那是什么?
别担心,我们通过引用发送局部变量s(在doinback中),在调用
onProgressUpdate
并记录其值时,有可能onProgressUpdate
正在更改s的值,这会导致doInBackground
中出现意外值。但是所有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
这就是我们所期望的,不是吗?
如果有更好的主意,我想听听
任何评论都会受到欢迎。
注:可能是太简单了,但我省了一周的时间。