Состояние сброса AsynctaskLoader

Это может показаться глупым вопросом, но я не могу понять статус AsynctaskLoader.

Я несколько раз читал документацию, а также другие руководства в Интернете. Однако я до сих пор не могу понять, когда асинтаск находится в состоянии сброса.

Взгляните на этот фрагмент кода, извлеченный из официальной документации. http://developer.android.com/reference/android/content/AsyncTaskLoader.html

@Override public void deliverResult(List<AppEntry> apps) {
    if (isReset()) {
        // An async query came in while the loader is stopped.  We
        // don't need the result.
        if (apps != null) {
            onReleaseResources(apps);
        }
    }

Этот метод вызывается, когда загрузчик завершает свою работу и должен отправить данные обратно в поток пользовательского интерфейса. Мой вопрос: почему мы спрашиваем, сброшен ли загрузчик? Что вообще означает его сброс? Класс говорит

/**
 * Return whether this load has been reset.  That is, either the loader
 * has not yet been started for the first time, or its {@link #reset()}
 * has been called.
 */

Вы можете подумать, что если загрузчик не был запущен в первый раз, он будет в состоянии STOPPED, зачем перезапускать?.

Наверное, я не совсем понимаю, как загрузчик реагирует на жизненный цикл активности, но в документации об этом ничего не сказано.


person frankelot    schedule 19.12.2014    source источник


Ответы (2)


arrow_upward
2
arrow_downward

"Однако я до сих пор не могу понять, когда асинтаск находится в состоянии сброса"

Я полагаю, вы имели в виду "... когда ЗАГРУЗЧИК находится в состоянии покоя"

Обычно можно использовать LoaerManager для управления жизненным циклом загрузчиков.

Когда пользователь вызывает LoaderManager#destroyLoader(), LoadManager удаляет этот загрузчик из своего кеша. Загрузчик также может быть уничтожен, когда вызывается LoaderManager#restartLoader() или когда действие/фрагмент проходит фазу уничтожения. Если такой загрузчик ранее доставлял данные своему клиенту (обычно Fragment или Activity), тогда LoaderManager вызовет onLoaderReset() и даст указание загрузчику выполнить сброс. Это дает клиенту возможность удалить любые ссылки на данные, а загрузчику освободить любые ресурсы, связанные с данными. Помните, что владельцем данных является загрузчик, а не клиент.

"Мой вопрос: почему мы спрашиваем, сброшен ли загрузчик?"

deliveryResult вызывается в контексте потока пользовательского интерфейса, но инициируется завершением фонового потока, который выполняет фактическую загрузку. Состояние загрузчика может быть изменено на reset() до завершения фонового потока. Проверка isReset() выполняется, чтобы избежать уведомления клиента о новых данных в ситуации состояния гонки, когда загрузчик находится в состоянии сброса.

"Что вообще означает его сброс?"

Загрузчик в состоянии сброса должен остановить все свои операции, так как вскоре после этого он может быть уничтожен. В частности, он должен освобождать любые ресурсы, занятые ранее загруженными данными, прекращать загрузку новых данных и отслеживать изменения в подчеркнутом источнике данных.

"Можно подумать, что если загрузчик не был запущен в первый раз, он будет в состоянии STOPPED, зачем перезапускаться?"

Состояние «Остановлено» указывает на то, что загрузчик ранее находился в запущенном состоянии. В остановленном состоянии загрузчик может иметь данные, которые были ранее загружены, и он должен отслеживать изменения в подчеркнутом источнике данных. Из состояния Stopped загрузчик может вернуться в запущенное состояние или в состояние сброса. Если он перезапущен, то он может использовать свои предыдущие загруженные данные, если никаких изменений в источнике данных не было, пока он был остановлен.

Когда загрузчик создается, но до его запуска, считается, что он находится в состоянии сброса. Это хорошо работает, потому что в этом состоянии еще нет загруженных данных, а также загрузчик не должен выполнять никаких операций, как указано выше.

person HaimS    schedule 15.01.2015

arrow_upward
5
arrow_downward

Думаю, это поможет вам

Я думаю, это поможет вам. Эта карта показывает как жизненный цикл Android, так и жизненный цикл загрузчика.

person Daniel Jose Padilla Peña    schedule 23.05.2017
comment
Очень красиво, а откуда вы взяли эту схему? - person Felipe Cerda; 20.06.2020