什么时候onPost执行AsyncTask执行?

时间:2015-01-05 13:12:47

标签: java android multithreading android-asynctask

考虑以下示例活动:

public class ExampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_info);

        new ExampleTask().execute("");

        // code line 1
        // code line 2
        // code line 3
        // code line 4
    }

    public class ExampleTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... address) {

            // some long-running stuff
            return "";
        }

        protected void onPostExecute(String text) {

        }
    }
}

  new ExampleTask().execute("");

我们启动一个运行UI线程的AsyncTask。我们无法预测何时完成。 AsyncTask的{​​{1}}方法再次在UI线程上运行。

我们假设onPostExecute正在执行AsyncTask方法的code line 2时完成。 何时执行onPostExecute方法?是等到onCreate完成还是立即执行?

我认为这个问题可以归结为Java(或者至少是Android)如何处理主线程运行但返回主线程的线程以及Java / Android如何调度两个竞争对象的代码序列#39;立即执行。 因此,如果答案能够提供一点点的一般见解,那就太好了。

3 个答案:

答案 0 :(得分:2)

你可以在这里看到这一切: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/AsyncTask.java

           // that's on the background thread
line #288: return postResult(doInBackground(mParams)); 

private Result postResult(Result result) {
        @SuppressWarnings("unchecked")
        Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                new AsyncTaskResult<Result>(this, result));
        // here it sends the message to the intenral UI handler
        message.sendToTarget(); 
        return result;
    }

表示:

AsyncTask向其自己的内部UI处理程序发布消息,这意味着onPostExecute只会在UI Looper上排队的所有其他内容被执行后执行

答案 1 :(得分:1)

它将在onCreate()完成后调用,因为UI线程上的任何回调都是按顺序处理的。首先,onCreate()然后onPostExecute() 但是,似乎这是一个实现细节,你不应该依赖它。

答案 2 :(得分:0)

在doInBackground方法中完成任务后,将立即调用

onPostExecute。查看有关AsyncTask

的详细信息
  

假设在执行onCreate方法的代码行2时完成了AsyncTask。何时执行onPostExecute方法?是等到onCreate完成还是会立即执行?

是的,它等待onCreate完成,onPostExecute将在onCreate方法之后调用。