有没有可能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呢?
注意:这只是我的应用程序的一个例子,有时会发生这种情况(根本不运行),我不能在这里编写所有的代码,因为它太复杂了。但总的来说,这种情况正在发生。
有什么想法吗?

最佳答案

好啊。我深入研究,发现答案是:doInBackgroundonProgressUpdate之间的消息传输不是异步的串行的(从基类名称)。任何带有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
这就是我们所期望的,不是吗?
如果有更好的主意,我想听听
任何评论都会受到欢迎。
注:可能是太简单了,但我省了一周的时间。

10-04 20:29