AsyncTask和Memory Observability

时间:2016-05-09 00:47:12

标签: android android-asynctask

我有以下类和内部“AsyncTask”(http://developer.android.com/reference/android/os/AsyncTask.html)定义。

class SomeClassA {

    Long b = 0;

    void executeTask() {
       // executed on main thread.
       b = 1;
       new SomeAsyncTask().execute();
    }

    private class SomeAsyncTask extends AsyncTask<Void, Void, Void> {

        protected Void doInBackground(Void... params) {
           b = 3;
        }

        protected void onPostExecute(Void param) {
           System.out.println(b);
        }
    }
}

我很好奇我对AsyncTask的“内存可见性”以及线程安全性的保证。根据我的理解,调用“doInBackground”在一个单独的线程中执行,因此我在“doInBackground”中对“b”所做的任何更改都不能保证在主线程上执行的任何回调中都是“可见的”(例如“onPostExecute()”,“onPreExecute”,“onProgressUpdate”等。

这是对的吗?所以在上面的例子中,“onPostExecute”中的“System.out.println(b)”可以打印1或3,但不能保证。我需要做些什么来保证这种记忆可观察性?

在AsyncTask网站(上面发布)中,我看到以下代码段。

  

记忆可观察性

     

AsyncTask保证所有回调调用的同步方式使得以下操作在没有显式同步的情况下是安全的。

     
      
  • 在构造函数或onPreExecute()中设置成员字段,并在doInBackground(Params ...)中引用它们。
  •   
  • 在doInBackground(Params ...)中设置成员字段,并在onProgressUpdate(Progress ...)和onPostExecute(Result)中引用它们。
  •   

我认为这“可能”解释了我的困惑,但我不明白这意味着什么。有人可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

  

所以在上面的例子中,&#34; System.out.println(b)&#34; in&#34; onPostExecute&#34;可以打印1或3但不保证

这将始终打印3.(或者,如果任务被取消,则不执行任何操作)。 onPostExecute仅在doInBackground正确完成后才会运行。

  

有人可以向我解释一下吗?

本节只是告诉您使用在各个命名方法中设置的命名方法中的成员进行保存。