Каков предпочтительный метод загрузки зависимых запросов с помощью 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, как и раньше.