3

在阅读AsyncTask 文档(关于线程规则的部分)时,我发现了这一点:

  • AsyncTask 类必须在 UI 线程上加载。这是从 JELLY_BEAN 自动完成的。
  • 任务实例必须在 UI 线程上创建。
  • 必须在 UI 线程上调用 execute(Params...)。

“加载”是什么意思?它不是实例化或执行,正如文档稍后谈到的那样。

4

1 回答 1

6

我不相信这个答案实际上是正确的。

如果这些东西实际上是相同的,那么文档单独列出实例化加载是没有意义的。我相信这个说法

AsyncTask 类必须在 UI 线程上加载。

指的是Java 类加载。换句话说,AsyncTask 本身需要加载到主线程上。在 Jelly Bean(或更高版本)中,这是自动的。但是,在旧版本的 Android 中,此类可能会加载到另一个线程上,这可能会导致问题。

有关更多信息,请参阅此 Google 讨论。基本上,有一些条件(例如,使用 的代码IntentService)可能导致AsyncTask首先在错误的(非主)线程上加载。

在 Jelly Bean 之前,最简单的解决方法似乎是使用类似的东西:

Class.forName("android.os.AsyncTask");

在应用程序的onCreate() 方法中,强制类加载在您想要的时候发生。


创建AsyncTask实例可能就是您认为的那样......实例化它:

MyAsyncTask task = new MyAsyncTask();

这也应该在主线程上运行。

于 2013-08-29T03:22:06.460 回答