Android 自定义 AsyncTaskLoader

发布于 2024-05-20 12:43:22 字数 3389 浏览 18 评论 0

Android3.0 以后推出了 Loader,用来异步加载数据的,配合 ListView 或者 GridView 等用 Adapter 作为数据源的来使用,非常方便。下面是我自己封装的一个自定义的 AsyncTaskLoader,可以异步加载 List 数据,留作以后备用。

自定义 AsyncTaskLoader

import java.util.Collections;
import java.util.List;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public class CustomListAsyncTaskLoader extends AsyncTaskLoader<List> {
private List list;
private LoadListener listener;
public CustomListAsyncTaskLoader(Context context, LoadListener listener) {
super(context);
this.listener = listener;
}

@Override
protected void onStartLoading() {
// just make sure if we already have content to deliver
if (list != null){
deliverResult(list);
}

// otherwise if something has been changed or first try
if(takeContentChanged() || list == null){
forceLoad();
}
}

@Override
protected void onStopLoading() {
cancelLoad();
}

@Override
protected void onReset() {
super.onReset();
onStopLoading();

// clear reference to object
// it's necessary to allow GC to collect the object
// to avoid memory leaking
list = null;
}

@Override
public List loadInBackground() {
// even if fail return empty list and print exception stack trace
list = Collections.unmodifiableList((List) listener.loading());
return list;
}

public interface LoadListener {
List loading();
}
}

使用样例

private LoaderManager.LoaderCallbacks<List> loaderCallbacks = new LoaderManager.LoaderCallbacks<List>() {
@Override
public Loader<List> onCreateLoader(int i, Bundle bundle) {
progress_bar.setVisibility(View.VISITIY);
return new CustomListAsyncTaskLoader(getActivity(), new LoadListener() {

@Override
public List loading() {
return getDataList();//这里可以写自己的耗时的操作,如获取网络数据,获取数据库数据等
}
});
}

@Override
public void onLoadFinished(Loader<List> listLoader, List list) {
progress_bar.setVisibility(View.GONE);
mAdapter.setData(list);
}

@Override
public void onLoaderReset(Loader<List> listLoader) {
mAdapter.clear();
}
};


//这个是自定义 Adapter 中的 setData 方法
public void setData(List<T> dataList){
this.clear();
if(Build.VERSION.SDK_INT >= 11){
this.addAll(dataList);
}else{
for(T data : dataList){
this.add(data);
}
}
this.notifyDataSetChanged();
}

关于 Loader 的使用如下

if(loaderManager.getLoader(001) == null){
loaderManager.initLoader(001, bundle1, loaderCallbacks); //bundle1 是传递的数据,可以为空
}else{
loaderManager.restartLoader(001, bundle1, loaderCallbacks);
}

时间原因,就不上传源码了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

忆伤

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文