Android MVP правильный способ освободить Presenter


Я работаю с архитектурой MVP, и я застрял на том, как правильно освободить презентера. Во-первых, позвольте мне рассказать вам, ребята, что происходит.

Задача

1) мой ведущий делает запрос асинхронного сервера.

2) Когда я получаю ответ сервера, мое представление (фрагмент) уже отсоединено, но у меня все еще есть его экземпляр, удерживающий мой презентатор (что может вызвать утечку памяти), и я вызываю метод из представления, чтобы установить некоторые данные, которые я получил от сервера.

3) В моем представлении я использую контекст из методаgetActivity () , который на этом этапе возвращаетnull .

КАК Я ПЫТАЛСЯ РЕШИТЬ ЭТУ ПРОБЛЕМУ

1) Когда я отсоединяю фрагмент, я вызываю метод release () на моем презентаторе. Внутри этого метода я думал о том, чтобы установить экземпляр моего представления в null. Это будет работать, но тогда мне нужно будет добавить проверки null буквально везде в моем presenter, проверяя, было ли мое представление уже установлено в null или нет. Кажется, это не самый лучший подход.

2) в моем представлении (фрагмент), проверьте, является ли getActivity () нулевым перед его использованием. Но это не устраняет проблему утечки памяти, и мне нужно было бы добавить эту проверку буквально везде в моем фрагменте (фрагментах);


У вас есть альтернатива этому? Является ли это правильным способом освободить мой презентатор, когда мой фрагмент отделен таким образом, что всякий раз, когда мой презентатор вызывает метод на моем представлении, я буду уверен, что представление присоединено к Активность? Является ли EventBus хорошим подходом для этого?

Большое спасибо!

1 3

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 конечно. Таким образом, вы очистите все текущие сетевые операции, не обновляя пользовательский интерфейс, если он отсутствует. Надеюсь, этот ответ поможет вам :)