【问题标题】:Loading image bitmap from content providers using asynctask使用 asynctask 从内容提供者加载图像位图
【发布时间】:2012-03-07 14:40:43
【问题描述】:

我一直在尝试通过 MediaStore 内容提供程序查询 sd 卡上的所有图像,并在 GridView 上显示它们的缩略图。

但是,如果我在主线程上加载图像缩略图,滚动会变得非常慢......

所以我尝试通过 asynctasks 加载位图: 滚动性能变得更好,但现在网格项目不断重新加载它们的缩略图,直到它得到正确的位图......

这是我的异步任务,它加载位图:

package x.y;

import java.lang.ref.WeakReference;

import android.content.ContentResolver;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory.Options;
import android.os.AsyncTask;
import android.provider.MediaStore;
import android.widget.ImageView;

public class ImageThumbnailLoader extends AsyncTask<Long, Void, Bitmap> {

    private final Options mOptions;

    private WeakReference<ImageView> mImageViewWeakReference;
    private ContentResolver mContentResolver;

        public ImageThumbnailLoader(ImageView imageView,
                ContentResolver cr) {
        mContentResolver = cr;
        mImageViewWeakReference = new WeakReference<ImageView>(imageView);
        mOptions = new Options();
        mOptions.inSampleSize = 4;
    }



    @Override
    protected Bitmap doInBackground(Long... params) {
        Bitmap result;
            result = MediaStore.Images.Thumbnails.getThumbnail(
                    mContentResolver, params[0],
                    MediaStore.Images.Thumbnails.MINI_KIND, mOptions);
        return result;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
            if (mImageViewWeakReference != null
                    && mImageViewWeakReference.get() != null)
                mImageViewWeakReference.get().setImageBitmap(result);
    }

}

这是我的自定义光标适配器:

package x.y;

import android.content.Context;
import android.database.Cursor;
import android.graphics.BitmapFactory.Options;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;

public class MediaCursorAdapter extends CursorAdapter {

    private LayoutInflater mInflater;
    private final static int mColumnID = 0;
    private Options mOptions;

    public MediaCursorAdapter(Context context, Cursor c) {
        super(context, c);

        mInflater = LayoutInflater.from(context);
        mOptions = new Options();
        mOptions.inSampleSize = 4;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ViewHolder holder = (ViewHolder) view.getTag();
        ImageThumbnailLoader imageLoader = new ImageThumbnailLoader(holder.thumbImg,
                context.getContentResolver());
        imageLoader.execute(cursor.getLong(mColumnID));
//      holder.thumbImg.setImageBitmap(MediaStore.Images.Thumbnails.getThumbnail(
//                  context.getContentResolver(), cursor.getLong(mColumnID),
//                  MediaStore.Images.Thumbnails.MINI_KIND, mOptions));
        Log.i("Prototype", "bindView : " + cursor.getPosition());
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        Log.i("Prototype", "newView : " + cursor.getPosition());
        View view = mInflater.inflate(R.layout.grid_item, null);
        ViewHolder holder = new ViewHolder(view);
        view.setTag(holder);
        return view;
    }


    private static class ViewHolder {
        ImageView thumbImg, dragImg;

        ViewHolder(View base) {
            thumbImg = (ImageView) base.findViewById(R.id.thumbImage);
            dragImg = (ImageView) base.findViewById(R.id.dragImage);
        }
    }

}

我用这段代码查询游标并将其发送到适配器:

query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA }, null, null,
    MediaStore.Images.Media._ID);

看起来我的自定义光标适配器上的 bindview() 被调用的频率比预期的要高...任何人都知道如何让我的 gridview 上的图像在保持滚动性能的同时停止重新加载?

提前致谢。

【问题讨论】:

    标签: android bitmap android-asynctask mediastore android-cursoradapter


    【解决方案1】:

    问题已解决,必须在 onPostExecute() 上检查异步任务开始时的图像是否与结束时的图像相同。

    新的绑定视图:

    @Override
        public void bindView(View view, Context context, Cursor cursor) {
    
            ViewHolder holder = (ViewHolder) view.getTag();
            holder.thumbImg.setId(cursor.getPosition());
            ImageThumbnailLoader imageLoader = new ImageThumbnailLoader(holder.thumbImg,
                context.getContentResolver());
            imageLoader.execute(cursor.getLong(mColumnID));
        Log.i("Prototype", "bindView : " + cursor.getPosition());
        }
    

    新的异步:

    public class ImageThumbnailLoader extends AsyncTask<Long, Void, Bitmap> {
    
        private final Options mOptions;
    
        private WeakReference<ImageView> mImageViewWeakReference;
        private ContentResolver mContentResolver;
        private int mPosition;
    
    
            public ImageThumbnailLoader(ImageView imageView,
                ContentResolver cr) {
            mContentResolver = cr;
            mImageViewWeakReference = new WeakReference<ImageView>(imageView);
            mOptions = new Options();
            mOptions.inSampleSize = 4;
            mPosition = imageView.getId();
        }
    
    
    
        @Override
        protected Bitmap doInBackground(Long... params) {
            Bitmap result;
                result = MediaStore.Images.Thumbnails.getThumbnail(
                    mContentResolver, params[0],
                    MediaStore.Images.Thumbnails.MINI_KIND, mOptions);
            return result;
        }
    
        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
                if (mImageViewWeakReference != null
                        && mImageViewWeakReference.get() != null
                            && mPosition == mImageViewWeakReference.get().getId())
                    mImageViewWeakReference.get().setImageBitmap(result);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2015-06-11
      • 2012-11-06
      相关资源
      最近更新 更多