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

Ama*_*mal 3 android android-asynctask

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

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

"装载"是什么意思?它没有实例化或执行,因为文档稍后讨论了这些.

Nat*_*ate 6

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

如果文档实际上是相同的,那么单独列出实例化加载文档是没有意义的.我相信这句话

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

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

有关详细信息,请参阅此Google讨论.基本上,有些条件(例如,代码使用IntentService)可能导致AsyncTask首次加载错误的(非主要)线程.

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

Class.forName("android.os.AsyncTask");
Run Code Online (Sandbox Code Playgroud)

在Application的onCreate()方法中,强制类加载发生在你想要的时候.


创建AsyncTask实例可能是你认为它是......它实例:

MyAsyncTask task = new MyAsyncTask();
Run Code Online (Sandbox Code Playgroud)

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