Фрагмент Android – использование loadermanager активности вместо Fragment's. Это нормально?

С учетом фрагмента, который загружает (много) данных из базы данных с помощью загрузчика.

Проблема:

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

Вопрос:

Чтобы избежать воссоздания загрузчика каждый раз, когда создается фрагмент, можно ли использовать getActivity.getSupportLoaderManager.initLoader(loaderId, null, false) в методе onActivityCreated фрагмента?

Я попробовал, протестировал его, и он работает нормально. Но я не уверен, что это правильно.

Solutions Collecting From Web of "Фрагмент Android – использование loadermanager активности вместо Fragment's. Это нормально?"

Фактически, проверяя исходный код, вы в конечном итоге делаете то же самое.

Fragment.getLoaderManager:

 /** * Return the LoaderManager for this fragment, creating it if needed. */ public LoaderManager getLoaderManager() { if (mLoaderManager != null) { return mLoaderManager; } if (mActivity == null) { throw new IllegalStateException("Fragment " + this + " not attached to Activity"); } mCheckedForLoaderManager = true; mLoaderManager = mActivity.getLoaderManager(mWho, mLoadersStarted, true); return mLoaderManager; } 

mWho – это в основном идентификатор фрагмента.

 final void setIndex(int index, Fragment parent) { mIndex = index; if (parent != null) { mWho = parent.mWho + ":" + mIndex; } else { mWho = "android:fragment:" + mIndex; } } 

Разница в Activity.getLoaderManager() заключается в том, кто будет (root)

Поэтому, даже если вы можете делать то, что вы просите, вызов его непосредственно из Фрагмента может быть лучшим подходом

  • Исходный код операции
  • Исходный код фрагмента

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

Могу ли я спросить, почему вы просто не сохраняете Фрагмент? Кажется, что вам нужно создать Loader во Фрагменте и создать фрагмент с помощью setRetainInstance (true). В этом случае не забудьте предоставить TAG при добавлении фрагмента. Таким образом, фрагмент сохранится даже до изменений конфигурации активности, и только представление будет воссоздано, оставив ваш загрузчик в живых.