我有两个问题:
onPreExecute()
,onProgressUpdate(Progress...)
和onPostExecute(Result)
?我想知道,因为我在工作线程上运行了TCP连接,当收到数据包时,我想启动一个新线程来解析这个数据包,之后刷新UI线程上的一些数据结构。 / p>
提前致谢!
答案 0 :(得分:15)
“必须在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());
}
}