以下:内容主要自己理解,可能存在一定实现方式和思维的偏差。 内容仅用于自我记录学习使用。如有错误,欢迎指正。
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,毕竟我只是个年近三十而不到的孩子(手动滑稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽稽)
Demo实例图:
目录结构:
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);
}
}