用于长寿命数据的AsyncTask或AsyncTaskLoader

时间:2015-04-13 16:43:14

标签: android android-activity android-asynctask

我需要下载需要在加载所述数据的活动的生命周期之后存活的数据。现在我有一个LocalData类。作为我的LocalData的内部类,我使用AsyncTask从远程服务器获取数据。我的LocalData类将数据保存在内存中(即字段),因此如果稍后重新打开活动,则可以使用相同的数据 - 这样我就不会对服务器进行不必要的调用。这个类的简单骨架是

class LocalData{
  private List<MyPojo> myData;

  public void fetchData(String query){
    //...
    //here I start asynctask that loads data into myData
    //I have call backs to notify activity, say I use Observer-Observable or whatever
  }

  public List<MyPojo> getData(){
    return myData;
  }
}

我想知道我是否应该继续使用AsyncTask或切换到AsyncTaskLoader。请包含一些解释,否则我不会从你的答案中学到任何东西。感谢。

我不认为这很重要,但数据适用于适配器。

2 个答案:

答案 0 :(得分:0)

您可能想要做的是将其缓存到磁盘:您可以使用异步任务,但是一旦获得数据,请将其写入应用程序的缓存目录。然后,下次您可以检查缓存是否存在,如果是,则在从服务器请求之前从磁盘中获取缓存。例如,您可以在每次应用程序开始保持新鲜时(或使用到期日期的组合)时删除缓存。由于数据似乎没有太大变化,因此异步任务加载器可能过度。

- Async与Loader -

因此,异步任务适用于短期任务,例如从服务器获取简单数据量,或处理位图或类似的任务。异步任务的问题是,如果您的活动被删除,您可能会丢失对它们的引用,即使您仍希望结果仍然存在。解决这个问题的方法是:将结果磁盘缓存到您的异步任务中(因为它在磁盘上,您可以在下次返回时找到它)而不是返回onPostExecute;设置异步任务以与保留的非ui片段进行通信;设置异步任务以提供应用程序范围的单例。

请注意,您始终可以使用Handler h = new Handler(Looper.getMainLooper()); h.post(new Runnable() { /* run * };);从任何后台线程回调UI线程。

加载器就像异步任务,但专门用于与UI集成:因此onPostExecute代替onLoadFinished {{1}}。例如,我创建了一个用于搜索和浏览引号的应用程序:我有一个所有引号的内容提供程序(非规范化),因此用户可以按标签,作者,主题等进行浏览。使用游标加载器,我很容易更新UI反映用户正在搜索的内容(或者他们是否更改了标签),因为游标加载器会处理在后台重新加载数据并更新UI,前提是我正确实现了回调:与异步任务不同,我没有'如果活动经历了配置更改,如果用户决定切换浏览条件(切换片段),或者自己管理传递游标,则必须管理加载器,只需在每个片段中实现三个加载器回调。

就类比而言,您可能会说异步任务在shell中的宏或别名,加载器就像一个脚本。

这很快,很粗糙,但希望有所帮助。

答案 1 :(得分:0)

我想你需要知道:

当您不必编写处理活动配置更改的代码时,

使用AsyncTaskLoader。

  • 您可以在onLoadFinished中更改片段的限制。

在加载数据后需要更改UI时,使用AsyncTask(特别是片段)。

所以......如果你需要更改UI,请使用AsyncTask,如果你不使用AsyncTaskLoader。