Обрабатывал эту официальную статью для Android , касающуюся растрового кэширования.
Мне было интересно узнать об архитектуре, представленной в этой статье:
public void loadBitmap(int resId, ImageView imageView) {
final String imageKey = String.valueOf(resId);
final Bitmap bitmap = getBitmapFromMemCache(imageKey);
if (bitmap != null) {
mImageView.setImageBitmap(bitmap);
} else {
mImageView.setImageResource(R.drawable.image_placeholder);
BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
task.execute(resId);
}
}
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
...
// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
final Bitmap bitmap = decodeSampledBitmapFromResource(
getResources(), params[0], 100, 100));
addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);
return bitmap;
}
...
}
loadBitmap проверяет, существует ли кэш, запускает асинхронную задачу, и эта задача помещает изображение в кэш.
Мне интересно, рискованно ли это, так как это не атомарно - и у вас есть один компонент, проверяющий кеш, а другой помещает вещи в кеш. Было бы лучше либо
переместить проверку существования в doInBackground; или
создайте другой способ, где все взаимодействие будет: Bitmap bitmap = getFromCacheOrDecode(key);
Что вы, ребята, думаете?