Я загружаю несколько изображений с моего сервера и использую их в списке. Убедившись, что изображения были фактически загружены (через службу), я загружаю их в объект Bitmap, используя BitmapFactory.decodeFile(). Функция возвращает null с перерывами.BitmapFactory.decodeFile возвращает null с перерывами
Если я обновляю фрагмент, изображения загружаются в растровое изображение должным образом. В основном я наблюдал это после первой загрузки, хотя это не последовало. В случае, если изображение уже загружено, иногда это наблюдается.
Вот код, я использую:
@Override
public void run() {
while (!downImageFile.exists()) {
try {
Thread.sleep(1000); // Waits for 1 second (1000 milliseconds)
} catch (InterruptedException e) {
Log.e(LOG_TAG, "Exception", e);
}
}
Log.v(LOG_TAG,"Image downloaded now "+downImageFile.getAbsolutePath());
//String updateWords = updateAuto(); // make updateAuto() return a string
imageView.post(new Runnable() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(downImageFile.getAbsolutePath());
if(bm==null){
Log.v(LOG_TAG,"Buzz image is null. Size is "+downImageFile.length()+" "+downImageFile.getAbsolutePath());
}
imageView.setImageBitmap(bm);
}
imageView.setVisibility(View.VISIBLE);
});
}
Вот соответствующие журналы:
11-08 01:32:41.290 32245-32245/com.halobee.main D/skia: --- decoder->decode returned false
11-08 01:32:41.290 32245-32245/com.halobee.main V/BeaconCustomList: Buzz image is null. Size is 255458 /data/user/0/com.halobee.main/files/buzz/hbuzz_b251149098404ebeb1198a5ac03087af20161107110912.jpg
Это не может быть OutOfMemory проблемой, так как нет таких журналов не печатаются и вопрос прерывистый. Я напечатал размер файла, чтобы подтвердить его существование, и это также действительное значение. Более того, проблема воспроизводится на некоторых устройствах, а не во всех. Я загружаю изображение в отдельный поток, а не в основной поток.
Ум, этот 'while' цикл страшен. Просто потому, что файл * существует *, не означает, что файл * полностью написан *. Используйте шину событий или что-то, чтобы служба сообщила уровню пользовательского интерфейса, когда изображение загружено и полностью сохранено. – CommonsWare
Эта строка 'while (! DownImageFile.exists())' проверяет, существует ли файл, есть ли гарантия, что все байты изображения были записаны в файл до того, как он сломает цикл while и попытается его декодировать? –
Если это обрабатывается асинхронно, вам не нужно зацикливать, потому что блокирование не является проблемой, так как ваш не в основном потоке. –