Android MVP правильный способ освободить Presenter
Я работаю с архитектурой MVP, и я застрял на том, как правильно освободить презентера. Во-первых, позвольте мне рассказать вам, ребята, что происходит.
Задача
1) мой ведущий делает запрос асинхронного сервера.
2) Когда я получаю ответ сервера, мое представление (фрагмент) уже отсоединено, но у меня все еще есть его экземпляр, удерживающий мой презентатор (что может вызвать утечку памяти), и я вызываю метод из представления, чтобы установить некоторые данные, которые я получил от сервера.
3) В моем представлении я использую контекст из методаgetActivity () , который на этом этапе возвращаетnull .
КАК Я ПЫТАЛСЯ РЕШИТЬ ЭТУ ПРОБЛЕМУ
1) Когда я отсоединяю фрагмент, я вызываю метод release () на моем презентаторе. Внутри этого метода я думал о том, чтобы установить экземпляр моего представления в null. Это будет работать, но тогда мне нужно будет добавить проверки null буквально везде в моем presenter, проверяя, было ли мое представление уже установлено в null или нет. Кажется, это не самый лучший подход.
2) в моем представлении (фрагмент), проверьте, является ли getActivity () нулевым перед его использованием. Но это не устраняет проблему утечки памяти, и мне нужно было бы добавить эту проверку буквально везде в моем фрагменте (фрагментах);
У вас есть альтернатива этому? Является ли это правильным способом освободить мой презентатор, когда мой фрагмент отделен таким образом, что всякий раз, когда мой презентатор вызывает метод на моем представлении, я буду уверен, что представление присоединено к Активность? Является ли EventBus хорошим подходом для этого?
Большое спасибо!
1 ответ:
Одна из главных целей presenter layer-быть независимым от платформы Android, что означает, что вы не импортируете ни один из пакетов из платформы Android, что делает его чистым классом Java. Вы должны сделать так, чтобы ваш
Activity
илиFragment
реализовывал интерфейсActivityView
или интерфейсFragmentView
, и пусть конкретныйActivity
илиFragment
реализует этот интерфейс. Теперь вonCreate()
вы создаете экземпляр presenter и передаете в качестве аргумента представление (Activtity или фрагмент), а в классе Presenter вы будет иметьActivityView
илиFragmentView
ссылку, инициализируя ее через конструктор, примерно так:Активность.java
public class Activity implements ActivityView { ... private Presenter mPresenter; public void onCreate() { // some other code mPresenter = new Presenter(this); // some other code }
Ведущий.java
Теперь вы можете вызывать методы вpublic class Presenter { private ActivityView mActivityView; public Presenter(ActivityView activityView) { this.mActivityView = activityView; } }
Activity
илиFragments
, но эти методы должны быть перечислены в интерфейсе. В случае, если вы являетесь вашим RxJava2, вы можете иметь объектCompositeDisposable
вPresenter
, добавляя свои сетевые вызовы к этому одноразовому, и в соответствующих методах жизненного цикла изActivity
илиFragment
, ваш может вызыватьdispose()
метод наcompositeDisposable
, черезPresenter
конечно. Таким образом, вы очистите все текущие сетевые операции, не обновляя пользовательский интерфейс, если он отсутствует. Надеюсь, этот ответ поможет вам :)