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

Posted

技术标签:

【中文标题】在 UI 线程上加载和创建 AsyncTask 有啥区别?【英文标题】:What is the difference between loading and creating AsyncTask on the UI thread?在 UI 线程上加载和创建 AsyncTask 有什么区别? 【发布时间】:2013-02-05 09:35:20 【问题描述】:

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

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

“正在加载”是什么意思?它不是实例化或执行,正如文档稍后谈到的那样。

【问题讨论】:

【参考方案1】:

我不相信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();

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

【讨论】:

以上是关于在 UI 线程上加载和创建 AsyncTask 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

onPreExecute() 和 onPostExecute() 是在 UI 线程还是在启动 AsyncTask 的线程上执行?

android asynctask怎么用

Android AsyncTask工作原理

Android:尽管使用了 AsyncTask,但主线程被阻止

AsyncTask 坑 哪些线程可以调用AsyncTask

如何在Android开发中用AsyncTask异步更新UI界面