2025年4月1日 星期二 乙巳(蛇)年 正月初二 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android 自定义 AsyncTaskLoader

时间:12-14来源:作者:点击数:3

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);
  • }

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐