Android 使用asynctask从内容提供程序加载图像位图

Android 使用asynctask从内容提供程序加载图像位图,android,bitmap,android-asynctask,mediastore,android-cursoradapter,Android,Bitmap,Android Asynctask,Mediastore,Android Cursoradapter,我一直试图通过MediaStore内容提供商查询sd卡上的所有图像,并在GridView上显示它们的缩略图 但是,如果我在主线程上加载图像缩略图,滚动速度会非常慢 因此,我尝试通过异步任务加载位图: 滚动性能变得更好了,但现在网格项继续重新加载缩略图,直到得到正确的位图 这是我的asynctask,它加载位图: package x.y; import java.lang.ref.WeakReference; import android.content.ContentResolver; im

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

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

因此,我尝试通过异步任务加载位图: 滚动性能变得更好了,但现在网格项继续重新加载缩略图,直到得到正确的位图

这是我的asynctask,它加载位图:

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

}
我使用以下代码查询光标并将其发送到适配器:

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上的图像吗


提前感谢。

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

新bindView:

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

}
公共类ImageThumbnailLoader扩展了异步任务{
私人最终选择权;
私有WeakReference mImageViewWeakReference;
私有ContentResolver-mContentResolver;
私人投资;
公共ImageThumbnailLoader(ImageView ImageView,
内容解析程序(cr){
mContentResolver=cr;
mImageViewWeakReference=新的WeakReference(图像视图);
mOptions=新选项();
mOptions.inSampleSize=4;
mPosition=imageView.getId();
}
@凌驾
受保护位图doInBackground(长…参数){
位图结果;
结果=MediaStore.Images.Thumbnails.getThumbnail(
mContentResolver,参数[0],
MediaStore.Image.Thumbnails.MINI_KIND、mOptions);
返回结果;
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(mImageViewWeakReference!=null
&&mImageViewWeakReference.get()!=null
&&mPosition==mImageViewWeakReference.get().getId())
mImageViewWeakReference.get().setImageBitmap(结果);
}
}
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);
    }

}