Android 自定义 AsyncTaskLoader
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 技术交流群。
上一篇: Github Hexo 创建博客
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论