考虑以下示例 Activity :
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
的 onPostExecute
方法再次在 UI 线程上运行。
假设 AsyncTask
在执行 onCreate
方法的代码行 2
时完成。
onPostExecute方法什么时候执行?是等到onCreate
完成还是立即执行?
我认为这个问题可以概括为Java(或至少Android)如何处理从主线程运行但返回主线程的线程,以及Java/Android如何调度两个“竞争”立即执行的代码序列执行。 因此,如果答案能够提供一些一般性的见解,那就太好了。
最佳答案
您可以在这里亲眼看到这一切: 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被执行
关于java - AsyncTask的onPostExecuted什么时候执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27780304/