Android3.0以後推出了Loader,用來異步加載數據的,配合ListView或者GridView等用Adapter作爲數據源的來使用,非常方便。
下面是我自己封裝的一個自定義的AsyncTaskLoader,可以異步加載List數據,留作以後備用。
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);
}
時間原因,就不上傳源碼了。如果大家有興趣交流,歡迎發郵箱[email protected],或者直接評論。