Android自定義AsyncTaskLoader

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],或者直接評論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章