Всегда ли необходимо initLoader из onCreate in Fragment? Что делать, если критические аргументы для загрузчика зависят от результатов другого загрузчика?Delaying Loaders
У вас есть 2 погрузчика: LoaderA и LoaderB. LoaderB требует результата от LoaderA для запуска. Оба LoaderA и LoaderB инициализируются в onCreate фрагмента, но LoaderB не имеет аргументов, чтобы он умышленно терпел неудачу. Как только LoaderA заканчивается, LoaderB перезапускается с новыми аргументами, чтобы он мог выполнить желаемый запрос.
инициализации загрузчика в фрагменте:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(LOADER_A, new Bundle(), this);
getLoaderManager().initLoader(LOADER_B, null, mLoaderBCallback);
}
вызова спины для LOADER_A в фрагменте:
@Override
public Loader<MyResultObject> onCreateLoader(int id, Bundle args) {
return new LoaderA(getActivity(), args);
}
@Override
public void onLoadFinished(Loader<MyResultObject> loader, final MyResultObject result) {
if (result != null) {
Bundle args = new Bundle();
args.putInt("id", result.getId());
getLoaderManager().restartLoader(LOADER_B, args, mLoaderBCallback);
}
}
Определение mLoaderBCallback в фрагменте:
private LoaderBCallback mLoaderBCallback = new LoaderBCallback();
(Реализация LoaderBCallback не является важно, его просто стандартный интерфейс LoaderCallbacks, который . Атес Экземпляр LoaderB и ручки, когда погрузчик закончена)
класс LoaderB (пожалуйста, простите любые потенциальные ошибки компилятора с этим определением класса, его просто пример):
public class LoaderB<List<AnotherResultObject>> extends AsyncTaskLoader<List<AnotherResultObject>> {
private Bundle mArgs;
public LoaderB(Context context, Bundle args) {
super(context);
mArgs = args;
}
@Override
public List<AnotherResultObject> loadInBackground() {
if (mArgs == null) {
// bail out, no arguments.
return null;
}
// do network request with mArgs here
return MyStaticClass.performAwesomeNetworkRequest(mArgs);
}
// boiler plate AsyncTaskLoader stuff here
......
}
есть лучший способ ? Можем ли мы обойтись без initLoader для LoaderB?
Редактировать: У меня создается впечатление, что загрузчики ВСЕГДА должны быть инициализированы в onCreate, чтобы они могли обрабатывать изменения конфигурации. Это может быть справедливо ТОЛЬКО для загрузчиков в действиях. Создаются ли загрузчики, созданные во Фрагментах, независимо от того, где они инициализируются?
Любая идея если загрузчик все еще переживет события жизненного цикла (например, изменение ориентации), если вы не начнете их где-то важными? – NPike
Он должен. Результат загрузчика сохраняется после изменения ориентации. – dymmeh