1

引用从这里获得的 AsyncTask 文档,它说

  • AsyncTask 类必须在 UI 线程上加载。这是从 JELLY_BEAN 自动完成的。
  • 任务实例必须在 UI 线程上创建。
  • execute(Params...)必须在 UI 线程上调用。
  • 不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), 。onProgressUpdate(Progress...)

现在在 UI 线程上创建 AsyncTask 引用的原因是什么?是 Looper 的问题吗?

4

3 回答 3

2

我认为这样做是为了确保 Handler 在 UI 线程上初始化,因此在处理程序的构造函数中,myLooper() 将返回 mainUIThreadLooper,稍后发送的消息将分发到 UI 线程。

public abstract class AsyncTask<Params, Progress, Result> {
    private static final InternalHandler sHandler = new InternalHandler();
....
}

public Handler() {
   ...
   mLooper = Looper.myLooper();
   ...
}
于 2012-11-07T09:05:49.910 回答
1

我认为在其他地方创建 AsyncTask 是没有意义的,因为 AsyncTask 专门用于在 UI 线程上做一些准备,然后在另一个线程中做一些事情,然后再次在 UI 线程中发布任何结果。

于 2012-10-15T10:04:42.820 回答
0

请检查这个答案。

AsyncTask.class 必须在 UI 线程上加载,因为它具有静态字段引用处理程序:

private static final InternalHandler sHandler = new InternalHandler();

因此,如果您将AsynckTask第一次在另一个带有 looper (NonMainThred)的线程上运行,那么AsuncTask 上的任何实例都会将其 onPostExecute (和其他)方法发布到那个特定的NonMainThread,无论您尝试从哪里启动 AsyncTask 。

如果现在您尝试处理 onPostExecute 中的任何 android-UI 元素,它将崩溃并出现以下错误:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
于 2013-04-26T14:50:31.370 回答