Задача была прервана в 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

Это выглядит здорово.

Другие вопросы по тегам