Android MVP 和生命周期架构组件
Android MVP and Lifecycle architecture component
我是新手,正在尝试将 MVP 与生命周期架构组件结合起来。
众所周知,您应该在启动和停止时从 PRESENTER 附加和分离 VIEW 以避免内存泄漏。但是如果 View 附加到 Presenter,LifecycleOwner/LifecycleObserver 将无法工作...
出于学习目的,我创建了简单的 (M)VP 应用程序,View 在 onStart() 和 onStop() 方法中附加和分离到 Presenter。它工作正常。
之后,我将 Presenter 转换为 LifecycleObserver,将其订阅到 LifecycleOwner 事件(LifecycleOwner 是 View)并从 View 中删除 onStart()/onStop() 方法。在这种情况下,应用程序会在启动时崩溃。
查看 class (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();
}
}
主持人 class (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;
}
}
这很好用。
然后我尝试像这样添加生命周期架构组件:
查看 class (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);
}
}
主持人 class (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.
结果:
因此应用程序在启动时崩溃并出现以下错误异常:
Unable to start activity MyView. Must be one and instanceof LifecycleOwner
如果不是 link 向 Presenter 查看,则错误消失。但它打破了 MVP 模式。那么,Android 上的 MVP 模式能否与 Lifecycle 相结合?
您需要检查您的 Lifecycle
是否至少处于 STARTED 状态,
对于解决方案,请考虑在 super()
调用之后将此代码放置在您的 onStart()
方法中:
getLifecycle().addObserver(myPresenter);
或者您可以通过检查条件将 LifeCycle
对象传递给您的演示者 & addObserver()
本身:
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// Do your stuff here
}
来自 here & also check Lifecycle.States 的更多内容:
您忘记覆盖
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;}
您至少需要 Support-Lib 26.1
我是新手,正在尝试将 MVP 与生命周期架构组件结合起来。
众所周知,您应该在启动和停止时从 PRESENTER 附加和分离 VIEW 以避免内存泄漏。但是如果 View 附加到 Presenter,LifecycleOwner/LifecycleObserver 将无法工作...
出于学习目的,我创建了简单的 (M)VP 应用程序,View 在 onStart() 和 onStop() 方法中附加和分离到 Presenter。它工作正常。
之后,我将 Presenter 转换为 LifecycleObserver,将其订阅到 LifecycleOwner 事件(LifecycleOwner 是 View)并从 View 中删除 onStart()/onStop() 方法。在这种情况下,应用程序会在启动时崩溃。
查看 class (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();
}
}
主持人 class (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;
}
}
这很好用。
然后我尝试像这样添加生命周期架构组件:
查看 class (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);
}
}
主持人 class (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.
结果:
因此应用程序在启动时崩溃并出现以下错误异常:
Unable to start activity MyView. Must be one and instanceof LifecycleOwner
如果不是 link 向 Presenter 查看,则错误消失。但它打破了 MVP 模式。那么,Android 上的 MVP 模式能否与 Lifecycle 相结合?
您需要检查您的 Lifecycle
是否至少处于 STARTED 状态,
对于解决方案,请考虑在 super()
调用之后将此代码放置在您的 onStart()
方法中:
getLifecycle().addObserver(myPresenter);
或者您可以通过检查条件将 LifeCycle
对象传递给您的演示者 & addObserver()
本身:
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// Do your stuff here
}
来自 here & also check Lifecycle.States 的更多内容:
您忘记覆盖
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;}
您至少需要 Support-Lib 26.1