java - AsyncTask的onPostExecuted什么时候执行?

标签 java android multithreading android-asynctask

考虑以下示例 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。我们无法预测它何时完成。 AsyncTaskonPostExecute 方法再次在 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/

相关文章:

java - 查询 Firebase 的位置范围

java - 如何使用 JDom 检索带前缀的子元素

java - 共享偏好编辑器混合值

c# - System.Threading.Timer.Timer() 的最佳重载方法匹配有一些无效参数

Java 哈希表并发

java - 如何在 Java 中比较字符串?

java - 对带有重音符号等特殊字符的数组进行排序

android - 如何在 QtCreator/Necessitas 中为 Qt/Android 应用构建 APK 包?

java - Room - 使用 MAX(numUsage) 获取对象

c++ - 多线程和使用事件