Android MVP и компонент архитектуры жизненного цикла - PullRequest
0 голосов
/ 02 октября 2018

Я новичок и пытаюсь объединить MVP с компонентом архитектуры жизненного цикла.

Хорошо известно, что вы должны подключать и отключать VIEW от PRESENTER при запуске и остановке, чтобы избежать утечек памяти.Но LifecycleOwner / LifecycleObserver не может работать, если View присоединен к Presenter ...

В целях обучения я создаю простое (M) приложение VP, View присоединяется и отсоединяется к Presenter в методах onStart () и onStop ().,Это работает нормально.

После этого я конвертирую Presenter в LifecycleObserver, подписываю его на события LifecycleOwner (LifecycleOwner is View) и удаляю методы onStart () / onStop () из View.В этом случае приложение вылетает при запуске.

Просмотр класса (v1):

public class MyView extends AppCompatActivity {

    private final static String TAG = "myLogs";
    MyPresenter myPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "CREATE");
        setContentView(R.layout.activity_main);
        myPresenter = new MyPresenter();
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "START");
        myPresenter.linkView(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "STOP");
        myPresenter.unlinkView();
    }
}

Класс докладчика (v1):

class MyPresenter {

    private final static String TAG = "myLogs";
    MyView view;

    public void linkView(MyView v) {
        Log.d(TAG, "linkView()");
        this.view = v;
    }

    public void unlinkView() {
        Log.d(TAG, "unlinkView()");
        this.view = null;
    }
}

Это прекрасно работает.

И затем я пытаюсь добавить компонент архитектуры жизненного цикла, например, так:

Просмотр класса (v2):

public class MyView extends AppCompatActivity {

    private final static String TAG = "myLogs";
    MyPresenter myPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "CREATE");
        setContentView(R.layout.activity_main);
        myPresenter = new MyPresenter();
        getLifecycle().addObserver(myPresenter);
    }
}

Класс докладчика (v2):

class MyPresenter implements LifecycleObserver {

    private final static String TAG = "myLogs";
    MyView view;

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void linkView(MyView v) {
        Log.d(TAG, "linkView()");
        this.view = v;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void unlinkView() {
        Log.d(TAG, "unlinkView()");
        this.view = null;
    }
}

Различия:

1. I add "implements LifecycleObserver" to MyPresenter;
2. add start/stop annotations to MyPresenter methods;
3. remove onStart()/onStop() methods from MyView;
4. subscribe MyPresenter to MyView lifecycle events in onCreate() method.

Результат:

В результате происходит сбой приложения при запуске со следующим исключением ошибки:

Невозможно запустить действие MyView.Должен быть один и экземпляр LifecycleOwner

Ошибка исчезнет, ​​если не связать View с Presenter.Но это ломает образец MVP.Итак, можно ли сочетать паттерн MVP на Android с жизненным циклом?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы забыли переопределить

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;}

Вам нужен как минимум Support-Lib 26.1

0 голосов
/ 02 октября 2018

Вам необходимо проверить, соответствует ли ваш Lifecycle как минимум в состоянии STARTED ,

для решения, рассмотрите возможность размещения этого кода в методе onStart() послеsuper() вызов:

getLifecycle().addObserver(myPresenter);

или вы можете передать объект LifeCycle своему докладчику и addObserver() сам, проверив условие:

 if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
 // Do your stuff here
 }

Больше от здесь и также проверьте Lifecycle.States :

...