我正在尝试按照Google网站上的一般指南在我的应用中创建一个图库。我使用AsyncTask
(下面发布的代码)使用了库。
然而,有两个问题:
1)每次离开时图像都会逐个重新加载并返回到图库活动。该库包含在setRetainInstance(true)
的片段中。
2)图像加载速度非常快,有时可能会滞后(例如,如果我在详细视图中快速浏览ViewPager
)。
要解决此问题,我认为我必须实施教程的LruCache
和DiskCache
段seen here。但是我不知道如何在保持下面已经写过的代码的同时做到这一点。谷歌的教程似乎重叠 - 例如,方法loadBitmap
在缓存教程中是不同的,我不知道如何将其与我下面的内容合并。
注意:这些图像保存在内部存储中 - 我没有下载它们。
有人可以向我提供有关如何在以下代码中实施LruCache
和DiskCache
的建议/示例吗?我对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);
}
}
}
}