我需要下载需要在加载所述数据的活动的生命周期之后存活的数据。现在我有一个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。请包含一些解释,否则我不会从你的答案中学到任何东西。感谢。
我不认为这很重要,但数据适用于适配器。
答案 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。
在加载数据后需要更改UI时,使用AsyncTask(特别是片段)。
所以......如果你需要更改UI,请使用AsyncTask,如果你不使用AsyncTaskLoader。