Подтвердить что ты не робот

OnLoadFinished() вызывается дважды

Я пытаюсь понять, что я делаю что-то неправильно в отношении Loaders. Я использую библиотеку поддержки, и у меня есть фрагмент, который в onCreate() вызывает initLoader(), устанавливающий себя как LoaderCallbacks, однако при вращении он получает результат дважды в onLoadFinished(), один раз в результате вызова init (и он уже имеет данные), и один раз в результате FragmentActivity зацикливается на всех загрузчиках в onStart() и доставляет результат, так как он уже имеет данные.

Если я только один раз вызываю init (при первом запуске фрагмента), он не устанавливает себя как обратный вызов для Loader, поэтому он вообще не получает вызов onLoadFinished. Кажется, что onLoadFinished следует вызывать только один раз, поскольку некоторые дорогостоящие вещи могут выполняться в onLoadFinished() (например, для очистки списков и т.д.), Поэтому я просто пытаюсь выяснить, является ли это ошибкой, или если я просто вызывая init в неподходящее время или что-то еще.

У кого-нибудь есть понимание этой проблемы?

4b9b3361

Ответ 1

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

public void onActivityCreated(Bundle savedInstanceState) {
...
       if(getLoaderManager().getLoader(Constants.LOADER_ID) == null) {
            getLoaderManager().initLoader(Constants.LOADER_ID, null, this);
        } else {
            getLoaderManager().restartLoader(Constants.LOADER_ID, null, this);
        }

...
}

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

Ответ 2

Я испытываю такую ​​же проблему самостоятельно, без хорошего решения. Это похоже на ошибку в фреймворке Android, вот аналогичный поток, в котором предлагаемое решение заключается в размещении initLoader() в onResume() - я пробовал его, и он работает, on onLoadFinished() вызывается только один раз: Android: LoaderCallbacks.OnLoadFinished вызывается дважды

Ответ 3

У меня была аналогичная проблема, и причина в том, что у меня были initLoader и restartLoader в моем коде. В зависимости от действия пользователя мой запрос может измениться, поэтому мне нужно было перезагрузить загрузчик.

Решение заключалось в использовании только restartLoader, даже в методе обратного вызова onResume замените initLoader на restartLoader.

Ответ 4

Смотрите мой пост в Android: LoaderCallbacks.OnLoadFinished дважды вызывается

У меня была аналогичная проблема при перезапуске фрагментов в ViewPager. Мое решение состоит в том, чтобы удалить загрузчик, как только я закончу его (в конце onLoadFinished), вызвав

getLoaderManager().destroyLoader(LOADER_ID);

Надеюсь, что это поможет!