Nella mia app io lavoro con ContentProvider
e utilizzare LoaderManager.LoaderCallbacks<Cursor>.
Android MVP: utilizzo sicuro contesto in Presenter
Fragment (Visualizza)
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;
}
}
Dal punto di vista MVP ho bisogno:
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)
}
}
Quindi, ho bisogno di un contesto in Presenter.
ci sono alcune sfumature:
Presenter sappiamo del contesto - è male, Presenter non dovrebbe conoscere l'Android.
Avere un contesto in Presenter può causare perdite di memoria.
io sono ora preoccupati per come evitare problemi come perdite di memoria, e il modo migliore passare al contesto in Presenter, utilizzare contesto applicativo o Attività/Frammento?
contesto App è la strada da percorrere. Se la vista ha bisogno del contesto di attività, può memorizzarla da sola (passata nel costruttore), ma assicurati di non mantenere un riferimento forte alla vista (a prescindere) se il tuo relatore sopravvive all'attività/frammento. – JohanShogun
Un altro pensiero è che potresti consentire alla tua attività/frammento di assumere il ruolo del presentatore. A me sembra che tu abbia fatto in modo che il tuo frammento assuma il ruolo della vista, che è un po 'strano come la funzionalità di base del frammento piuttosto che quella del presentatore. La tua vista è nei file xml e visualizza sottoclassi. – JohanShogun
Grazie per il feedback. Ho una situazione in cui parte la logica di business in Presenter (la parte più grande) e un'altra parte in Fragment (funziona con CursorLoader) e questo crea problemi. Voglio spostare tutta la logica aziendale in Presenter. – Alexandr