【问题标题】:When is onPostExecuted of AsyncTask executed?AsyncTask 的 onPostExecuted 什么时候执行?
【发布时间】:2015-03-03 00:52:38
【问题描述】:

考虑以下示例活动:

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 方法的code line 2 时完成。 onPostExecute 方法什么时候执行?它是等到onCreate 完成还是会立即执行?

我认为这个问题可以概括为 Java(或至少 Android)如何处理从主线程运行但返回主线程的线程,以及 Java/Android 如何调度两个“竞争”的代码序列以立即进行执行。 因此,如果答案能提供一些一般性的见解,那就太好了。

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    您可以在此处亲自查看所有内容: 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 上排队的所有其他内容被执行后执行

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        onPostExecute 将在 doInBackground 方法中的任务完成后立即被调用。查看AsyncTask的详细信息

        假设 AsyncTask 在 onCreate 方法的第 2 行代码正在执行时完成。 onPostExecute 方法什么时候执行?是等到 onCreate 完成还是会立即执行?

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

        【讨论】:

        • 这描述了关于 AsyncTask 生命周期调用 onPostExecute 的时间,而不是关于 UI 线程。
        • 它确实在等待 onCreate 完成
        • 这是不正确的。 onPostExecuted 在 UI 线程上排队。请看我的回答。 AsyncTask 或任何其他类,都无法停止当前 UI 线程执行,以执行自己的方法。它必须将其发送到队列
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2016-01-07
        • 1970-01-01
        相关资源
        最近更新 更多