onProgressUpdate错过了一些发布

Fre*_*uss 1 database android 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]);
 }
Run Code Online (Sandbox Code Playgroud)

我遇到的结果是什么

abbd


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

Fre*_*uss 6

好.我深挖并找到了答案:消息之间的传输doInBackgroundonProgressUpdate不是异步的串行(来自基类名称).在任何呼叫doInBackgroundpublishProgress(xx)最终会达到onProgressUpdate,但没有一个对一个.
例如,非常虚拟的演示:

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

onProgressUpdate(String par) {
Log.d(par);
}
Run Code Online (Sandbox Code Playgroud)

结果如下: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);
}
Run Code Online (Sandbox Code Playgroud)

这一次在正常情况下,结果必须是:1 2 3 4 5 6 7 8 9 10
这就是我们所期望的,不是吗?
如果有更好的想法,我想听到,
任何评论都会受到欢迎.
注意:可能过于简单的情况,但保存了我的一周.