【问题标题】: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 线程上调用。

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

【问题讨论】:

    标签: android android-asynctask


    【解决方案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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多