考虑以下示例活动:
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;立即执行。 因此,如果答案能够提供一点点的一般见解,那就太好了。
答案 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)
onPostExecute。查看有关AsyncTask
的详细信息假设在执行onCreate方法的代码行2时完成了AsyncTask。何时执行onPostExecute方法?是等到onCreate完成还是会立即执行?
是的,它等待onCreate完成,onPostExecute将在onCreate方法之后调用。