您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

Android 自定义 AsyncTaskLoader

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

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

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

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