在工作线程中启动异步任务

时间:2012-03-19 00:06:33

标签: android multithreading asynchronous task

我有两个问题:

  • 我们可以在工作线程中启动/执行异步任务吗?
  • 如果是,则在UI线程上调用方法onPreExecute()onProgressUpdate(Progress...)onPostExecute(Result)

我想知道,因为我在工作线程上运行了TCP连接,当收到数据包时,我想启动一个新线程来解析这个数据包,之后刷新UI线程上的一些数据结构。 / p>

提前致谢!

5 个答案:

答案 0 :(得分:15)

来自Android AsyncTask doc

“必须在UI线程上创建任务实例。”和

必须在UI线程上调用“execute(Params ...)”。

所以我认为你的第一个问题的答案是“不”。就第二种情况而言,这些方法都是在UI线程上调用的,但这有点没有实际意义。

编辑:我不确定这些是绝对限制还是强烈建议,但在这两种情况下,我都建议关注它们。

答案 1 :(得分:6)

仅用于记录:如果在UI-Thread外部启动 AsyncTask ,则不会从UI-Thread(但来自调用者线程)执行 onPreExecute 。这将导致例外。但是, onPostExecute 方法将始终在UI-Thread上执行。希望能帮助别人:)

答案 2 :(得分:5)

根据Android doco,您必须从UI线程运行AsyncTask,但实际上它取决于谁首先在AsyncTask.class中运行此行:

private static final InternalHandler sHandler = new InternalHandler();

如果您有从UI和工作线程调用的AsyncTask,您可以首先从UI线程调用它来解决此限制。如果你先从你的工作线程中找到它,那你就注定了。 我宁愿不依赖于此,因为实现细节可以随时改变,但是如果你像我一样想知道“为什么我的其他AsyncTask工作”,这个知识很有用。

答案 3 :(得分:4)

  

来自Android AsyncTask doc:

     

“必须在UI线程上创建任务实例。”和

     

必须在UI线程上调用“execute(Params ...)”。

所以,以下是合法的。

new Thread(new Runnable() {
                @Override
                public void run() {
                    // do some work here

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            new MyAsyncTask(ctx).execute(); 
                        }
                    });
                }
            }).start();

答案 4 :(得分:0)

简单来说,我们可以在worker中启动AsyncTask。您可以在新的Thread中执行AsyncTask,非常简单。 原因在于Android源代码: [clike here]

private static class InternalHandler extends Handler {
    public InternalHandler() {
        super(Looper.getMainLooper());
    }
}