W moim app pracuję z ContentProvider
i wykorzystać LoaderManager.LoaderCallbacks<Cursor>.
Android MVP: bezpieczne użytkowanie Kontekst w Presenter
fragment (Widok)
public class ArticleCatalogFragment extends BaseFragment
implements ArticleCatalogPresenter.View,
LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.registerContentObserver(new LoaderContentObserver(new Handler(), loader));
updateUI(data);
}
private Loader onCreateArticleCatalogLoader(Bundle args) {
int categoryId = args.getInt(CATEGORY_ID);
Loader loader = new ArticleCatalogLoader(this.getActivity(), categoryId);
return loader;
}
}
Z punktu widzenia MVP muszę:
Presenter
public class ArticleCatalogPresenter extends BasePresenter
implements LoaderManager.LoaderCallbacks<Cursor> {
View view;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.registerContentObserver(new LoaderContentObserver(new Handler(), loader));
view.updateUI(data);
}
private Loader onCreateArticleCatalogLoader(Bundle args) {
int categoryId = args.getInt(CATEGORY_ID);
Loader loader = new ArticleCatalogLoader(context, categoryId); // need Context
return loader;
}
interface View {
updateUI(Cursor data)
}
}
Potrzebuję kontekstu w prezencie.
Istnieją pewne niuanse:
Presenter wiedzieć o kontekście - to jest złe, nie Prezenter powinien wiedzieć o Androidzie.
Posiadanie kontekstu w programie Presenter może prowadzić do wycieku pamięci.
Martwię się, jak uniknąć problemów, takich jak wycieki pamięci, i jak najlepiej przekazywać kontekst w prezencie, korzystać z kontekstu aplikacji lub aktywności/fragmentu?
kontekst aplikacji jest do zrobienia. Jeśli widok wymaga kontekstu działania, może go zapisać samodzielnie (przekazany w konstruktorze), ale upewnij się, że nie posiadasz silnego odniesienia do widoku (niezależnie), jeśli twój prezenter przeżyje działanie/fragment. – JohanShogun
Inną myślą jest, że możesz pozwolić swojej aktywności/fragmentowi wziąć rolę prezentera. Wydaje mi się, że sprawiłeś, że twój fragment wciela się w rolę widoku, to trochę dziwne, ponieważ podstawowa funkcjonalność tego fragmentu całkiem dobrze pogrąża się w stosunku do prezentera. Twój widok znajduje się w plikach xml i przeglądaj podklasy. – JohanShogun
Dziękujemy za opinię. Mam sytuację, gdy część logiki biznesowej w Presenter (większa część) i innej części w Fragment (praca z CursorLoader) i to stwarza problemy. Chcę przenieść całą logikę biznesową w Presenter. – Alexandr