Задача была прервана в Universal-Image-Loader
Недавно я использовал версию 1.9.1 UIL в своем проекте, и мой тестер неоднократно сообщал, что изображения не отображаются при первом запуске приложения, но это нормально, когда приложение запускается или завершается впоследствии. Затем я проверяю логи и logcat показывает, что "задача была прервана". И тогда я нахожу сегмент InterruptedException в исходных кодах. И оригинальные коды:
/** @return true - if task should be interrupted; false - otherwise */
private boolean waitIfPaused() {
AtomicBoolean pause = engine.getPause();
synchronized (pause) {
if (pause.get()) {
log(LOG_WAITING_FOR_RESUME);
try {
pause.wait();
} catch (InterruptedException e) {
L.e(LOG_TASK_INTERRUPTED, memoryCacheKey);
return true;
}
log(LOG_RESUME_AFTER_PAUSE);
}
}
return checkTaskIsNotActual();
}
/** @return true - if task should be interrupted; false - otherwise */
private boolean delayIfNeed() {
if (options.shouldDelayBeforeLoading()) {
log(LOG_DELAY_BEFORE_LOADING, options.getDelayBeforeLoading(), memoryCacheKey);
try {
Thread.sleep(options.getDelayBeforeLoading());
} catch (InterruptedException e) {
L.e(LOG_TASK_INTERRUPTED, memoryCacheKey);
return true;
}
return checkTaskIsNotActual();
}
return false;
}
Этот сегмент кода находится в LoadAndDisplayImageTask com.nostra13.universalimageloader.core. Итак, в каких ситуациях будет выброшено это исключение, плохая скорость соединения с интернетом, нехватка памяти в устройстве, загруженность процессора или что-то еще?
2 ответа
Я думаю, что это может произойти, когда вы звоните ImageLoader.stop()
или же ImageLoader.destroy()
или если система завершила приложение, поэтому потоки приложения были прерваны. Между тем, synchronized
предложение в waitIfPaused
предотвратить одновременную загрузку URL-адреса одной и той же картинки. Таким образом, если URL-адрес был загружен в то же время, второй будет ждать, если первая картинка будет загружена успешно.
Этот вопрос решается здесь: https://github.com/nostra13/Android-Universal-Image-Loader/issues/586
Это выглядит здорово.