Android MVP和生命周期架构组件
我是一个新手,尝试将MVP与生命周期架构组件结合起来 众所周知,您应该在开始和停止时从演示者附加和分离视图,以避免内存泄漏。但如果视图附加到演示者,LifecycleOwner/LifecycleObserver将无法工作 出于学习目的,我创建了简单(M)VP应用程序,该视图在onStart()和onStop()方法中附加并分离到Presenter。它很好用 之后,我将Presenter转换为LifecycleObserver,订阅LifecycleOwner事件(LifecycleOwner是视图),并从视图中删除onStart()/onStop()方法。在这种情况下,应用程序在启动时崩溃 查看类(v1):Android MVP和生命周期架构组件,android,mvp,lifecycle,Android,Mvp,Lifecycle,我是一个新手,尝试将MVP与生命周期架构组件结合起来 众所周知,您应该在开始和停止时从演示者附加和分离视图,以避免内存泄漏。但如果视图附加到演示者,LifecycleOwner/LifecycleObserver将无法工作 出于学习目的,我创建了简单(M)VP应用程序,该视图在onStart()和onStop()方法中附加并分离到Presenter。它很好用 之后,我将Presenter转换为LifecycleObserver,订阅LifecycleOwner事件(LifecycleOwner是
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 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;
}
}
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 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.
演示者课程(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 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;
}
}
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 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.
这个很好用
然后我尝试添加生命周期体系结构组件,如下所示:
查看类(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();
}
@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 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;
}
}
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 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.
演示者课程(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();
}
@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 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;
}
}
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 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.
区别在于:
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 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;
}
}
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 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.
结果:
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 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;
}
}
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 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的一个实例
如果未将视图链接到演示者,则错误将消失。但它打破了MVP模式。那么,Android上的MVP模式可以与生命周期结合吗?您需要检查您的生命周期是否至少处于
启动状态
解决方案,考虑此代码放置在<代码> OnStutter()/<代码>方法> <强> <代码>()> <代码> <强> >调用:
getLifecycle().addObserver(myPresenter);
或者,您可以通过检查以下条件,将生命周期
对象传递给演示者&addObserver()
自身:
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
// Do your stuff here
}
更多信息请查看:您忘记覆盖
private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);
public LifecycleRegistry getLifecycle() {
return lifecycleRegistry;}
您至少需要支持Lib 26.1您使用了哪个版本的生命周期?我没有手动连接生命周期库。Is附带android支持库:实现'com.android.support:appcompat-v7:28.0.0'