在 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 的线程上执行?