Android MVP和生命周期架构组件

Android MVP和生命周期架构组件,android,mvp,lifecycle,Android,Mvp,Lifecycle,我是一个新手,尝试将MVP与生命周期架构组件结合起来 众所周知,您应该在开始和停止时从演示者附加和分离视图,以避免内存泄漏。但如果视图附加到演示者,LifecycleOwner/LifecycleObserver将无法工作 出于学习目的,我创建了简单(M)VP应用程序,该视图在onStart()和onStop()方法中附加并分离到Presenter。它很好用 之后,我将Presenter转换为LifecycleObserver,订阅LifecycleOwner事件(LifecycleOwner是

我是一个新手,尝试将MVP与生命周期架构组件结合起来

众所周知,您应该在开始和停止时从演示者附加和分离视图,以避免内存泄漏。但如果视图附加到演示者,LifecycleOwner/LifecycleObserver将无法工作

出于学习目的,我创建了简单(M)VP应用程序,该视图在onStart()和onStop()方法中附加并分离到Presenter。它很好用

之后,我将Presenter转换为LifecycleObserver,订阅LifecycleOwner事件(LifecycleOwner是视图),并从视图中删除onStart()/onStop()方法。在这种情况下,应用程序在启动时崩溃

查看类(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.
演示者课程(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'