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