AsyncTask何时在后台运行?

时间:2018-04-24 21:56:21

标签: java android android-asynctask

请原谅新秀问题......

我有一个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类中的函数?

1 个答案:

答案 0 :(得分:2)

  

但是不会在MainActivity类中使用第二个选项   用户界面失去了框架?如果是这样,为什么第二个选项甚至   存在?

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

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

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

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

  • 可能存在多线程情况,在继续执行之前,AsyncTask的输出对此线程至关重要。

Android公开的其他几个API很少使用,但有特殊要求的人可能需要它们。我认为谷歌需要冗长,以满足开发人员需求的需求,因为修改几个琐碎的用例可能会很昂贵。