Предпочтительный способ загрузки зависимых запросов с помощью LoaderManager

Каков предпочтительный метод загрузки зависимых запросов с помощью API LoaderManager в Android? На данный момент лучшее, что я мог придумать, - это что-то вроде:

@Override
public void onCreate( Bundle savedInstanceState ) {
    getLoaderManager().initLoader( FIRST, null, this );
}

@Override
public void onLoadFinished( Loader<Cursor> loader, Cursor data ) {
    switch ( loader.getId() ) {
    case FIRST:
        Bundle args = new Bundle();
        args.putInt( ID, somethingFromData( data ) );
        getLoaderManager().restartLoader( SECOND, args, this );
        break;

    case SECOND:
        somethingElseFromData( data );
        break;
    }
}

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

Прежде всего, если вы считаете, что сумма составляет до двух нагрузок FIRST (один старый и один новый) и три загрузки SECOND (два старых и один новый), который швы по крайней мере немного расточительно. Я на самом деле не возражаю, кроме того, что это неприятность для отладки, но мне также кажется, что я должен вести себя недетерминированно, потому что вы не знаете, какие нагрузки закончится первым. Я вернусь к новым данным для SECOND, если изменится связь между FIRST и SECOND, или я получу кешированные значения?

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

Чтобы прояснить немного: проблема наиболее заметна, если строки в FIRST содержат ссылку на строки в SECOND, а после обратной навигации строка (строки) в FIRST загружена не указывает на ту же строку (s) в SECOND, как и раньше.

Ответ 1

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

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