AnyncTaskLoader写法

 

以加载图库的照片为例
解释都在代码中,看吧

代码块

package auggie.gallery;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
import android.support.v4.content.AsyncTaskLoader;
import android.util.SparseArray;

import java.util.ArrayList;
import java.util.List;

/**
 * Created With Android Studio
 * User @47
 * Date 2014-08-25
 * Time 10:29
 * 加载 相册的图片
 */
public class GalleryImageLoader extends AsyncTaskLoader<List<OImageBean>> {

    /** 需要查询的列**/
    public static final String[] QUERY_COLUMN_THUMBS = {
            MediaStore.Images.Thumbnails._ID,
            MediaStore.Images.Thumbnails.DATA,//图片在内存卡地址
            MediaStore.Images.Thumbnails.IMAGE_ID
    };


    /** 需要查询的列**/
    public static final String[] QUERY_COLUMN_ORIGINAL = {
            MediaStore.Images.ImageColumns._ID,
            MediaStore.Images.ImageColumns.DATA,//图片在内存卡地址
            MediaStore.Images.ImageColumns.SIZE,//图片大小
            MediaStore.Images.ImageColumns.DISPLAY_NAME,//显示的名字
            MediaStore.Images.ImageColumns.DATE_MODIFIED,//修改日期
            MediaStore.Images.ImageColumns.BUCKET_ID,//文件夹ID
            MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME//文件夹名字
    };

    private List<OImageBean> mImageList;

    private List<BucketBean> mBucketList;
    private SparseArray<BucketBean> mBucketArray;

    public List<BucketBean> getBucketList() {
        if(mBucketList == null){
            mBucketList = new ArrayList<BucketBean>();
            int size = mBucketArray.size();
            for(int i = 0 ; i < size ; i++){
                mBucketList.add(mBucketArray.get(mBucketArray.keyAt(i)));
            }
        }
        return mBucketList;
    }

    public GalleryImageLoader(Context context) {
        super(context);
    }

    @Override
    public List<OImageBean> loadInBackground() {
        mBucketList = null;//清理
        mImageList = new ArrayList<OImageBean>();
        ContentResolver contentResolver = getContext().getContentResolver();
        SparseArray<OImageBean> indexById  = new SparseArray<OImageBean>();
        Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                QUERY_COLUMN_ORIGINAL,
                null,null,MediaStore.Images.Media.DATE_MODIFIED+" DESC");
        if(!cursor.moveToFirst()) return mImageList;

        mBucketArray = new SparseArray<BucketBean>();
        do {
            OImageBean bean = new OImageBean(cursor);
            mImageList.add(bean);
            indexById.append(bean.id, bean);
            //添加文件夹列表中
            BucketBean bucketBean =
                    mBucketArray.get(
                            bean.bucketID,
                            new BucketBean(bean.bucketID,bean.bucketDisplayName));
            mBucketArray.append(bucketBean.buckID,bucketBean);
            bucketBean.oImageBeanList.add(bean);
        } while (cursor.moveToNext());
        cursor.close();

        //查询缩略图d
        cursor = contentResolver.query(
                MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                QUERY_COLUMN_THUMBS,null,null,
                MediaStore.Images.Thumbnails.IMAGE_ID + " DESC");
        //获取缩略图
        if(cursor.moveToFirst()){
            do{
                int imageId = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Thumbnails
                        .IMAGE_ID));
                OImageBean bean  =  indexById.get(imageId);
                if(bean == null) {
                    continue;
                }
                bean.setThumb(cursor);
            }while (cursor.moveToNext());
        }
        cursor.close();
        return mImageList;
    }


    @Override
    protected void onReset() {
        super.onReset();
        //要重置的时候,停止加载
        onStopLoading();

        if(mImageList != null){//释放之前的资源
            onReleaseResource(mImageList);
            mImageList = null;
        }
    }

    @Override
    protected void onStopLoading() {
        super.onStopLoading();
        cancelLoad();
    }


    @Override
    public void onCanceled(List<OImageBean> data) {
        super.onCanceled(data);
        onReleaseResource(data);
    }

    @Override
    public void deliverResult(List<OImageBean> data) {
        if(isReset()){//如果已经关闭了,我们不需要结果
            if(data != null) onReleaseResource(data);
        }

        List<OImageBean> oldList = mImageList;
        mImageList = data;

        //如果是刚开始,我们立刻传递结果给人家
        if(isStarted()){
            super.deliverResult(data);
        }

        if(oldList != null){
            onReleaseResource(oldList);
        }

    }

    @Override
    protected void onStartLoading() {
        //如果mImageList 不是空,就立刻发放数据
        if(mImageList != null) deliverResult(mImageList);

        //如果数据有改变过,立刻加载数据
        if(takeContentChanged() || mImageList == null){
            forceLoad();
        }

    }

    private void onReleaseResource(List<OImageBean> mList) {
        //如果是cursor 这里需要释放资源
    }


}

更好的排版请看

http://www.evernote.com/l/AQwL7x_IOA9AbYM0LEPQJ5QvxpuVVspOzGg/

    原文作者:@47
    原文地址: https://www.cnblogs.com/Jabba93/p/3994831.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞