#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.