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