繁体   English   中英

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

[英]Start Async Task within a worker thread

我有两个问题:

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

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

提前致谢!

来自Android AsyncTask文档

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

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

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

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

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

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

private static final InternalHandler sHandler = new InternalHandler();

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

来自Android AsyncTask文档:

“必须在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();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM