DiskLruCache не получает растровое изображение из ключа

#android #bitmap #android-asynctask

#Android #растровое изображение #android-asynctask

Вопрос:

Я использую JakeWhartons DiskLruCache и некоторый код из сообщения в SO. Я могу добавить растровые изображения с ключами, но не могу получить его в getBitmap(), вместо этого он возвращает null . Создаю ли я каждый раз новый кеш? Не уверен в этом. Вот мой код:

AsyncTask:

 public BitmapWorkerAsyncTask(ImageView imageView,Context context1) {

    imageViewReference = new WeakReference<ImageView>(imageView);
    diskLruCache = new DiskLruImageCache(context1, "thumbnails",
            (int) (20 * Math.pow(2, 20)), CompressFormat.JPEG, 70);
}

// Decode image in background.
@Override
protected Bitmap doInBackground(Object... params) {
    // Get the passed arguments here
    view = (View) params[0];
    songId = (Long) params[1];
    albumId = (Long) params[2];
    context = (Context) params[3];
    data = (Long) params[2];


    // Check disk cache
    Bitmap bitmap = diskLruCache.getBitmap(String.valueOf(albumId)); // returns null
}
  

DiskLruImageCache:

  public DiskLruImageCache(Context context, String uniqueName,
        int diskCacheSize, CompressFormat compressFormat, int quality) {
    try {
        final File diskCacheDir = getDiskCacheDir(context, uniqueName);
        // Log.d(TAG, "file cache dir=" diskCacheDir.getAbsolutePath());
        mDiskCache = DiskLruCache.open(diskCacheDir, APP_VERSION,
                VALUE_COUNT, diskCacheSize);
        mCompressFormat = compressFormat;
        mCompressQuality = quality;
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void put(String key, Bitmap data) {

    DiskLruCache.Editor editor = null;
    try {
        editor = mDiskCache.edit(key);
        if (editor == null) {
            return;
        }

        if (writeBitmapToFile(data, editor)) {
            mDiskCache.flush();
            editor.commit();
            if (BuildConfig.DEBUG) {
                Log.d("cache_test_DISK_", "image put on disk cache "   key
                          "size aft adding="   mDiskCache.get(key));
            }
        } 
}

public Bitmap getBitmap(String key) {

    Bitmap bitmap = null;
    DiskLruCache.Snapshot snapshot = null;
    try {
        Log.d("cache_test_DISK_", "bitmap got="   mDiskCache.get(key)
                  " key="   key);
        snapshot = mDiskCache.get(key); // null here
        if (snapshot == null) {
            return null;
        }
}
  

Комментарии:

1. Вы пробовали печатать значение albumId перед тем, как сделать getBitmap вызов? Если приведение к Long завершится неудачей, ваше String.valueOf(albumId) приведет к строке, содержащей слово «null» (но на самом деле это не нулевая строка).

2. Да, я пробовал это. Оно не равно нулю.

3. Когда я проверяю значение mDiskCache.size() , оно выводит 0 внутри getBitmap(), тогда как внутри put() это не 0 . Итак, создается ли DiskCache снова и снова при вызове конструктора?

4. Даже в конструкторе mDiskCache.size() выводит 0.

5. Проблема решена путем ввода кода для вызова конструктора в oncreate.