Я новичок и пытаюсь объединить 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 с жизненным циклом?