在阅读AsyncTask 文档(关于线程规则的部分)时,我发现了这一点:
- AsyncTask 类必须在 UI 线程上加载。这是从 JELLY_BEAN 自动完成的。
- 任务实例必须在 UI 线程上创建。
- 必须在 UI 线程上调用 execute(Params...)。
“加载”是什么意思?它不是实例化或执行,正如文档稍后谈到的那样。
在阅读AsyncTask 文档(关于线程规则的部分)时,我发现了这一点:
- AsyncTask 类必须在 UI 线程上加载。这是从 JELLY_BEAN 自动完成的。
- 任务实例必须在 UI 线程上创建。
- 必须在 UI 线程上调用 execute(Params...)。
“加载”是什么意思?它不是实例化或执行,正如文档稍后谈到的那样。
我不相信这个答案实际上是正确的。
如果这些东西实际上是相同的,那么文档单独列出实例化和加载是没有意义的。我相信这个说法
AsyncTask 类必须在 UI 线程上加载。
指的是Java 类加载。换句话说,AsyncTask
类本身需要加载到主线程上。在 Jelly Bean(或更高版本)中,这是自动的。但是,在旧版本的 Android 中,此类可能会加载到另一个线程上,这可能会导致问题。
有关更多信息,请参阅此 Google 讨论。基本上,有一些条件(例如,使用 的代码IntentService
)可能导致AsyncTask
首先在错误的(非主)线程上加载。
在 Jelly Bean 之前,最简单的解决方法似乎是使用类似的东西:
Class.forName("android.os.AsyncTask");
在应用程序的onCreate() 方法中,强制类加载在您想要的时候发生。
创建AsyncTask
实例可能就是您认为的那样......实例化它:
MyAsyncTask task = new MyAsyncTask();
这也应该在主线程上运行。