onProgressUpdate错过了一些发布

时间:2011-08-06 13:25:21

标签: android database android-asynctask

是否有可能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]);
 }

我遇到的结果是什么

a b b d

发生了什么? 注意:这只是我的应用程序的说明,有时会发生这种情况(根本不会运行),我无法在这里编写所有代码,因为它太复杂了。但总的来说,这种情况正在发生。
那么任何想法?

1 个答案:

答案 0 :(得分:6)

确定。我深挖并找到答案:doInBackgroundonProgressUpdate之间的消息传输不是异步的串行(来自基类名称)。 doInBackgroundpublishProgress(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
什么? 不要担心,我们通过引用和调用的时间onProgressUpdate发送局部变量s(在doinback。中)并记录其值,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
这就是我们的期望,不是吗? 如果有更好的想法,我想听听 任何评论都会受到欢迎 注意:可能过于简单,但保存了我的一周。