在UI线程上加载和创建AsyncTask有什么区别?

时间:2013-02-20 11:39:02

标签: android android-asynctask

在阅读线程规则的部分AsyncTask documentation时,我发现了这一点:

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

" loading" 是什么意思?它没有实例化或执行,因为文档后来谈到了这些。

1 个答案:

答案 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();

也应该在主线程上运行。