Lifecycle组件在MVP模式下的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明出处。 https://blog.csdn.net/qq_36882793/article/details/85157010

以下:内容主要自己理解,可能存在一定实现方式和思维的偏差。 内容仅用于自我记录学习使用。如有错误,欢迎指正。

Lifecycle的基础使用

Lifecycle可以监听对应的Activity的生命周期变化。在MVP模式中,P层有时候需要根据V层声明周期的变化而做出一些操作(如V层销毁时,P层也要释放某些资源)。正常情况下可以通过P层暴露出来的方法供V层调用。如下:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPrestener.destory();
    }

但这种情况下如果有多个类或者View释放会造成onDestory方法的拥挤。另外在P层中也要写一堆声明周期的方法供V层调用。因此可以采用Lifecycle来监听V层生命周期。
Lifecycle的使用很简单:
第一步: 创建一个类(接口)并实现(继承) LifecycleObserver 接口,并增加对应监听方法。通过注解可以实现监听盛行周期。 其中 ON_ANY 是监听所有生命周期,其余的都可以见名知意。

public interface BaseLifecycleObserver extends LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onAny(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestory(LifecycleOwner owner);
}

第二步: 在需要监听的V层onCreate()方法中添加一句话(这里的BasePrestenerImpl类实现了BaseLifecycleObserver 接口):

// BasePrestenerImpl类需要通过直接或间接的方式实现LifecycleObserver接口
getLifecycle().addObserver(new BasePrestenerImpl());

其中BasePrestenerImpl的实现如下: 当监听的V生命周期触发onCreate,onResume等方法时会触发BasePrestenerImpl里面的onCreate,onResume等方法,实现生命周期监听。

/**
 * @Data :  2018/12/20
 * @Des : P层基类实现了各种生命周期的方法,子类需要使用哪个实现哪个
 */

public class BasePrestenerImpl implements BaseLifecycleObserver{
    @Override
    public void onAny(LifecycleOwner owner) {

    }

    @Override
    public void onCreate(LifecycleOwner owner) {

    }

    @Override
    public void onStart(LifecycleOwner owner) {

    }

    @Override
    public void onStop(LifecycleOwner owner) {

    }

    @Override
    public void onResume(LifecycleOwner owner) {

    }

    @Override
    public void onPause(LifecycleOwner owner) {

    }

    @Override
    public void onDestory(LifecycleOwner owner) {

    }
}

其中 BasePrestenerImpl类的内容
以上即可完成Lifecycle的基本使用。

接下来是一个MVP模式示例 ---- 其实以下内容只是我觉着是这样的,没有什么权威性,因为我还没在项目中用过MVP,毕竟我只是个年近三十的孩子(手动滑稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽)

目录结构:
项目目录接口

M层:

 * @Data :  2018/12/20
 * @Des : MVP M 层 负责数据的获取
 */

public class LifecycleModel {
    // P层引用
    private LifecycleContract.LifecyclePrestener mPestener;

    public LifecycleModel(LifecycleContract.LifecyclePrestener mPestener) {
        this.mPestener = mPestener;
    }

    /**
     *  M层提供给P层获取数据的接口 -- 供P层调用
     */
    public void getDate(){
        //TODO : 在这里获取数据, 将获取到的数据传给P层
        String s = "获取到的数据";
        mPestener.setData(s);
    }
}

P层:

LifecycleContract — 契约类,将P层接口和V层接口都在此写出,方便看逻辑

/**
 * @Data :  2018/12/20
 * @Des : MVP 契约接口
 */
public interface LifecycleContract {
    // P层接口
    interface LifecyclePrestener{
        void setData(String data);  // 提供给V层用于返回数据
        void getData();     // 提供给V层用户获取数据
    }
    // V 层接口
    interface LifecycleView{
        void setView(String data);      // V层用于接收数据并返回
    }
}

BaseLifecycleObserver — LifecyclerObserver的基础接口,声明了声明周期的方法

package com.example.qxb_810.lifecyclelivedataviewmodeldemo.lifecycle;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.OnLifecycleEvent;

/**
 * @Data :  2018/12/20
 * @Des : LifecycleObserver基类接口
 */

public interface BaseLifecycleObserver extends LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onAny(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause(LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void onDestory(LifecycleOwner owner);
}

BasePrestenerImpl — 继承P层实现类,可以做一些基础操作,由于这里只是个Demo,没做什么操作,只实现所有的生命周期方法,子类继承时根据所需重写不同的方法。

/**
 * @Data :  2018/12/20
 * @Des : P层基类实现了各种生命周期的方法,子类需要使用哪个实现哪个
 */

public class BasePrestenerImpl implements BaseLifecycleObserver{
    @Override
    public void onAny(LifecycleOwner owner) {

    }

    @Override
    public void onCreate(LifecycleOwner owner) {

    }

    @Override
    public void onStart(LifecycleOwner owner) {

    }

    @Override
    public void onStop(LifecycleOwner owner) {

    }

    @Override
    public void onResume(LifecycleOwner owner) {

    }

    @Override
    public void onPause(LifecycleOwner owner) {

    }

    @Override
    public void onDestory(LifecycleOwner owner) {

    }
}

LifecyclePrestenerImpl — P层具体实现类

/**
 * @Data :  2018/12/20
 * @Des :  MVP  P 层实现类 负责数据的处理校验,同时监听了Activity的生命周期
 */
public class LifecyclePrestenerImpl extends BasePrestenerImpl implements LifecycleContract.LifecyclePrestener{
    // M层实例
    private LifecycleModel mModel;
    // V层引用
    private LifecycleContract.LifecycleView mLifecycleView;

    public LifecyclePrestenerImpl() {}
    public LifecyclePrestenerImpl(LifecycleContract.LifecycleView mLifecycleView) {
        this.mLifecycleView = mLifecycleView;
        this.mModel = new LifecycleModel(this);
    }

    /**
     *  提供给V层用户数据获取
     */
    public void getData(){
        mModel.getDate();
    }

    /**
     *  返回给View层的数据
     * @param data
     */
    @Override
    public void setData(String data) {
        // TODO: P层对获取到的数据进行适当的校验和逻辑处理,传递给V层
        // 假装进行了一系列的校验。。。。。
        mLifecycleView.setView(data);
    }

    /**************************************************************************/
    // TODO: 下面是监听Activity的生命周期,使用BasePrestenerImpl可以让子类P根据需要重写不同监听方法
    /**
     *  当Activity创建时初始化某些东西。。。。。。
     * @param owner
     */
    @Override
    public void onCreate(LifecycleOwner owner) {
        super.onCreate(owner);
    }

    /**
     *  这里观测者Activity的声明周期,当Activity销毁时,这里也要销毁其引用,否则会造成内存泄漏
     * @param owner
     */
    @Override
    public void onDestory(LifecycleOwner owner) {
        super.onDestory(owner);
        mModel = null;
        mLifecycleView = null;
    }
}

V层:

BaseActivity

/**
 * @Data :  2018/12/20
 * @Des : 基类
 */
@RequiresApi(api = Build.VERSION_CODES.N)
public class BaseActivity extends AppCompatActivity {
    public final String TAG = this.getClass().getSimpleName();

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(layout());
        ButterKnife.bind(this);
    }

    protected int layout() {
        return 0;
    }
}

MainActivity ---- V层


/**
 * create 2018/12/20 16:13
 * desc  V层,负责数据展示
 */
@RequiresApi(api = Build.VERSION_CODES.N)
public class MainActivity extends BaseActivity implements LifecycleContract.LifecycleView {
    @BindView(R.id.tv_hello)
    TextView tvHello;

    private LifecycleContract.LifecyclePrestener mPrestener;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 将生命周期交付于Lifecycle(此V层对应P层,因为不同P层监控的V层不同,所以不能写在基类中)
        getLifecycle().addObserver(new LifecyclePrestenerImpl());
        // TODO : 此时我需要更新数据 调用P层获取数据
        mPrestener = new LifecyclePrestenerImpl(this);
        initEvent();
    }

    /**
     *  初始化事件
     */
    private void initEvent() {
        tvHello.setOnClickListener(v -> mPrestener.getData());
    }

    @Override
    protected int layout() {
        return R.layout.activity_main;
    }

    @Override
    public void setView(String data) {
        // TODO : 在这里拿到P层处理好的数据,并使用更新数据
        Log.e(TAG, "我是View层, 我拿到了P层的数据 : " + data);
        tvHello.setText(data);
    }

}

猜你喜欢

转载自blog.csdn.net/qq_36882793/article/details/85157010
今日推荐