[英]Start Async Task within a worker thread
我有两个问题:
onPreExecute()
, onProgressUpdate(Progress...)
和onPostExecute(Result)
方法? 我想知道,因为我在工作线程上运行了TCP连接,当收到数据包时,我想启动一个新线程来解析这个数据包,之后刷新UI线程上的一些数据结构。
提前致谢!
“必须在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.