为磁带库使用磁盘和内存缓存

时间:2015-01-15 03:48:20

标签: java android caching bitmap

我正在尝试按照Google网站上的一般指南在我的应用中创建一个图库。我使用AsyncTask(下面发布的代码)使用了库。

然而,有两个问题:

1)每次离开时图像都会逐个重新加载并返回到图库活动。该库包含在setRetainInstance(true)的片段中。

2)图像加载速度非常快,有时可能会滞后(例如,如果我在详细视图中快速浏览ViewPager)。

要解决此问题,我认为我必须实施教程的LruCacheDiskCacheseen here。但是我不知道如何在保持下面已经写过的代码的同时做到这一点。谷歌的教程似乎重叠 - 例如,方法loadBitmap在缓存教程中是不同的,我不知道如何将其与我下面的内容合并。

注意:这些图像保存在内部存储中 - 我没有下载它们。

有人可以向我提供有关如何在以下代码中实施LruCacheDiskCache的建议/示例吗?我对Android的这些部分很新,它可能会让人感到困惑。谢谢!

GalleryAdapter.java

@Override
public View getView(int position, View view, ViewGroup viewGroup)
{
    View v = view;
    ImageView imageView;

    if (v == null)
    {
        v = inflater.inflate(R.layout.gallery_row, viewGroup, false);
        v.setTag(R.id.image, v.findViewById(R.id.image));
    }

    imageView = (ImageView) v.getTag(R.id.image);

    loadBitmap(position, imageView);

    return v;
}

public void loadBitmap(int data, ImageView imageView)
{
    if (cancelPotentialWork(data, imageView))
    {
        final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
        final AsyncDrawable asyncDrawable = new AsyncDrawable(mContext.getResources(), mPlaceHolderBitmap, task);
        imageView.setImageDrawable(asyncDrawable);
        task.execute(data);
    }
}

static class AsyncDrawable extends BitmapDrawable
{
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask)
    {
        super(res, bitmap);
        bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask()
    {
        return bitmapWorkerTaskReference.get();
    }
}

public static boolean cancelPotentialWork(int data, ImageView imageView)
{
    final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);

    if (bitmapWorkerTask != null)
    {
        final int bitmapData = bitmapWorkerTask.data;
        if (bitmapData == 0 || bitmapData != data)
        {
            bitmapWorkerTask.cancel(true);
        }
        else
        {
            return false;
        }
    }

    return true;
}

private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView)
{
    if (imageView != null)
    {
        final Drawable drawable = imageView.getDrawable();
        if (drawable instanceof AsyncDrawable)
        {
            final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
            return asyncDrawable.getBitmapWorkerTask();
        }
    }

    return null;
}

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap>
{
    private final WeakReference<ImageView> imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView)
    {
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(Integer... params)
    {
        data = params[0];
        return Bitmap.createScaledBitmap(BitmapFactory.decodeFile(mPaths.get(data)), 100, 100, true);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap)
    {

        if (isCancelled())
        {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null)
        {
            final ImageView imageView = imageViewReference.get();
            final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
            if (this == bitmapWorkerTask && imageView != null)
            {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

0 个答案:

没有答案