Какова область применения Loadermanager?
Вопрос
При выявлении погрузчиков в вашем LoaderManager вы используете уникальные идентификаторы. Я спрашиваю о том, насколько уникальными должны быть эти идентификаторы.
Есть ли у каждой деятельности и фрагмента свой собственный погрузчик? Используют ли фрагменты погрузчику, к которому они привязаны? Есть ли только один LoaderManager, которым владеет приложение?
Бонусные баллы, если вы можете сказать мне, как можно изменить, какой LoaderManager вы используете. Если я хочу, чтобы каждый фрагмент в моей деятельности использовал один и тот же погрузочный манагер (некоторые из них тянут одни и те же данные, и обмена погрузчиками было бы неплохо), возможно ли это?
Решение
В настоящее время я переношу свое приложение в пакет совместимости Android (в основном для загрузчика и фрагментов). В настоящее время я пытаюсь поделиться загрузчиком между двумя фрагментами, чтобы сэкономить запрос на мой ContentProvider. Добро пожаловать в мой мир! ;)
Простой вариант использования:
- DummyActivity расширяет фрагментируемость / log.d (constants.logtag, "DummyActivity.oncreate" + getSupportLoaderManager (). ToString ());
- DataFragment Extends Fragment реализует LoaderManager.LoaderCallBacks / log.d (constants.logtag, "DataFragment.oncreate" + GetLoaderManager (). ToString ());
- ReportFragment Extends Fragment реализует LoaderManager.LoaderCallBacks / log.d (constants.logtag, "ReportFragment.onCreate" + GetLoaderManager (). ToString ());
DummyActivity инстановирует фрагмент данных, а более поздние инстаквирует отчет. Выход LogCat показывает различные адреса для каждого LoaderManager. В качестве первого вывода, каждый фрагмент, кажется, имеет надлежащий погрузчик ...
Я продолжу и обновлю, если смогу ответить на ваш (наш;)) вопрос. Если вы добились какого -либо прогресса, пожалуйста, поделитесь своими ценными знаниями.
Обновлять:
Я предполагаю, что идентификаторы погрузчика связаны только с локальным объемом погрузчика погрузчика для определенного фрагмента, чтобы несколько локальных погрузчиков были связаны с фрагментом (так что вы можете вернуть другой загрузчик в OncreateLoader на основе идентификатора Arg и Вызовы инициаторов).
До сих пор мне удалось «повторно использовать» загрузчик (... или нет):
- Во -первых, я включил отладку LoaderManager с getSupportLoaderManager().enableDebugLogging(true);
в фиктивной активности onCreate
метод
- Тогда я позвонил getActivity().getSupportLoaderManager().initLoader(78, null, this);
от onCreate
Методы как данных, так и отчета.
- DataFragment раскрывает курсора, созданный onCreateLoader
Метод с помощью сеттера на частном члене McUrsorloader.
- Отчет onCreateLoader
Возвращает курсорог -загрузчик данных (после получения фрагмента с findFragmentByTag
).
Отфильтрованный (и слегка запутанный) выход LogCat:
DummyApp D DummyActivity.onCreate
DummyApp D DataFragment.newInstance
DummyApp D ReportFragment.newInstance
DummyApp D DataFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in SpecificAction{4059ee98}}: args=null
DummyApp D DataFragment.onCreateLoader
LoaderManager V Created new loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D DataFragment.onCreate
DummyApp D DataFragment.onActivityCreated
DummyApp D ReportFragment.onCreate
LoaderManager V initLoader in LoaderManager{405a19d0 in DummyActivity{4059ee98}}: args=null
LoaderManager V Re-using existing loader LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyApp D SpecificActionReportFragment.onCreate
DummyApp D SpecificActionReportFragment.onActivityCreated
LoaderManager V Starting in LoaderManager{405a19d0 in DummyActivity{4059ee98}}
LoaderManager V Starting: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
DummyProvider D query called
DummyProvider D […]
DummyProvider D [end of query]
LoaderManager V onLoadComplete: LoaderInfo{405a2298 #78 : CursorLoader{405a22e0}}
LoaderManager V onLoadFinished in CursorLoader{405a22e0 id=78}: CursorWrapperInner{405afb20}
DummyApp D ReportFragment.onLoadFinished
DummyApp D ReportFragment.displayActionReport
DummyApp D DummyActivity.setReportViewsVisibility
DummyApp D ReportFragment.setSaveReportImageViewVisibility
Два фрагмента добавляются из фиктивной активности onCreate
Метод (отличается от описанного варианта использования, но это ничего не меняет на проблему, над которой мы работаем). К сожалению, погрузчик переназначен к последнему фрагменту, вызывая его (здесь отчетффрагмент)… и dataFragment.onloadfiniened никогда не вызывается. Как следствие, отчет-фрагмент выглядит хорошо, но фрагмент данных не является актуальным, поскольку обновление вызывается из onLoadFinished
этого класса.
Я предполагаю, что существует базовый вызов Unregister, а затем вызов регистрации на курсоре.
Продолжение следует…
Другие советы
Да. Это сработало для меня. У меня есть 3 разных фрагмента в ящике для навигации, где одни и те же данные заполняются в разных списках. (Все фрагменты являются частью одной и той же деятельности).
Мой asynctaskloader:
public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> {
public MyTaskLoader(Context context) {
super(context);
}
@Override
public HashMap<String, Integer> loadInBackground() {
...
return hashMap;
}
...
}
Используйте один идентификатор загрузчика во всех фрагментах.
Фрагмент1:
public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
Используйте тот же идентификатор для фрагмента2:
public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
Адаптер должен быть инициализирован перед инициализацией загрузчика. Работает до сих пор. Но это правильный путь? Есть ли лучший метод использования общего загрузчика для нескольких фрагментов?