In meiner app ich mit ContentProvider
arbeiten und verwenden LoaderManager.LoaderCallbacks<Cursor>.
Android MVP: sichere Anwendung Context in Presenter
Fragment (Ansicht)
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;
}
}
Aus Sicht MVP ich brauche:
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)
}
}
Also, ich brauche einen Kontext in Presenter.
Es gibt einige Nuancen:
Presenter über den Kontext kennen - es ist schlecht, Moderator sollte über die Android nicht wissen.
Ein Kontext in Presenter kann zu Speicherverlust führen.
Ich bin jetzt besorgt darüber, wie Probleme wie Speicherlecks zu vermeiden, und wie man am besten Context in Presenter geben, Anwendungskontext oder Aktivität/Fragment verwenden?
App Kontext ist der Weg zu gehen. Wenn die Ansicht den Aktivitätskontext benötigt, den sie selbst speichern kann (im Konstruktor übergeben), müssen Sie sicherstellen, dass Sie keine starke Referenz auf die Ansicht haben (unabhängig davon, ob Ihr Moderator die Aktivität/das Fragment überlebt). – JohanShogun
Ein anderer Gedanke ist, dass Sie Ihre Aktivität/Ihr Fragment die Rolle des Präsentators übernehmen lassen könnten. Für mich scheint es, dass Sie Ihr Fragment dazu gebracht haben, die Rolle des Views zu übernehmen, das ist ein bisschen seltsam, da die grundlegende Funktionalität des Fragments ziemlich weit über die des Moderators hinausgeht. Ihre Ansicht befindet sich in den XML-Dateien und Unterklassen anzeigen. – JohanShogun
Vielen Dank für Ihr Feedback. Ich habe Situation, wenn Teil Geschäftslogik in Presenter (größter Teil) und ein anderer Teil in Fragment (Arbeit mit CursorLoader) und das schafft Probleme. Ich möchte alle Geschäftslogik in Presenter verschieben. – Alexandr