【问题标题】:When does AsyncTask run in the background?AsyncTask 什么时候在后台运行?
【发布时间】:2018-04-24 21:56:21
【问题描述】:

所以请原谅菜鸟的问题...

我有一个 AsyncTask:

class DownloadWeather extends AsyncTask<String, Void, String>{

}

但我注意到有两种方法可以从中获取信息...即使用 onPostExecute:

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
}

或者简单地从 mainActivity 中这样调用它:

json = downloadWeather.execute(url).get();

据我所知,AsyncTask 的全部目的是保持用户界面的交互性......但是在 MainActivity 类中使​​用第二个选项不会导致 UI 丢失帧吗?如果是这样,为什么第二个选项甚至存在?

同样...是否有一种简单的方法可以从 onPostExecute 方法调用位于 MainActivity 类中的函数?

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    但不会在 MainActivity 类中使​​用第二个选项导致 UI丢帧?如果是这样,为什么第二个选项甚至 存在吗?

    虽然 AsyncTask 的主要目的是促进 UI 线程的正确和轻松使用并执行后台操作,但可能有一些用例可以使用 get()

    由于对这个问题的回答可能有点武断,您可能不同意我的回答,但get() 的一些用例可能如下:

    • 在某些情况下,您可能希望将 AsyscTask 用作单个任务或与其他一些任务捆绑: 考虑一个场景,您必须根据 Id 下载一些数据。 Ids 和数据的 API 是不同的。您需要使用一个 API 来下载 Ids 和一个 API 来下载数据。您可以创建一个包装器,该包装器将使用IdDownloadTask.get()DataDownloadtask.get() 来确保顺序加载。 如果有ID,可以直接执行DataDownloadTask.execute()

    • 您还可以在测试套件中使用get(),创建测试来分析您的 Web API 所花费的往返时间。

    • 可能存在多线程情况,在继续执行进一步执行之前,AsyncTask 的输出对于该线程是必不可少的。

    Android 还公开了其他几个很少使用的 API,但有特殊要求的人可能需要它们。我觉得 Google 需要详细说明,以便它们满足开发人员的大量需求,因为对几个微不足道的用例进行修改可能会很昂贵。

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多