代码之家  ›  专栏  ›  技术社区  ›  Tiaan

AsyncTask何时在后台运行?

  •  4
  • Tiaan  · 技术社区  · 6 年前

    所以请原谅我的菜鸟问题。。。

    我有一个异步任务:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Sagar    6 年前

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

    尽管AsyncTask的主要目的是促进UI线程的正确和简单使用,并执行后台操作,但在某些用例中可能会出现以下情况: get() 可以使用。

    由于这个问题的答案可能有点武断,您可能不同意我的答案,但在某些用例中 获取() 可能如下所示:

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

    • 您也可以使用 获取() 在测试套件中,创建用于分析web API所用往返时间的测试。

    • 可能存在多线程情况,其中 AsyncTask 在继续进一步执行之前,对该线程至关重要。

    Android还公开了其他几个很少使用的API,但有特殊要求的人可能需要它们。我觉得Google需要冗长,这样才能满足开发者的大量需求,因为修改几个微不足道的用例可能会很昂贵。