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