Не атомарное кеширование - PullRequest
0 голосов
/ 01 ноября 2018

Обрабатывал эту официальную статью для 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 проверяет, существует ли кэш, запускает асинхронную задачу, и эта задача помещает изображение в кэш.

Мне интересно, рискованно ли это, так как это не атомарно - и у вас есть один компонент, проверяющий кеш, а другой помещает вещи в кеш. Было бы лучше либо

  1. переместить проверку существования в doInBackground; или

  2. создайте другой способ, где все взаимодействие будет: Bitmap bitmap = getFromCacheOrDecode(key);

Что вы, ребята, думаете?

1 Ответ

0 голосов
/ 01 ноября 2018

Это не рискованно, потому что оказывается, что это атомно. Как указано в документах , LruCache является поточно-ориентированным. Поток пользовательского интерфейса всегда сможет «увидеть» любые предыдущие изменения, сделанные в mMemoryCache на doInBackground().

В addBitmapToMemoryCache() есть небольшое состояние гонки, когда второй фоновый работник может добавить растровое изображение к mMemoryCache после того, как первый фоновый работник подтвердит, что getBitmapFromMemCache() вернул null, но это мало практическое следствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...