前言:为什么要引进Lifecycle?
在我们平常的开发工作中,当我们在一个Activity 或者Fragment 中初始化了一些资源(比如presenter ,handler ,MediaPlayer 等),然后在onDestroy 中对这些资源进行销毁工作,我们的代码就会变成这样
public class Presenter{
public Presenter(){
//doSomething
}
public void destroy(){
//清空资源
}
}
class MyActivity extends AppCompatActivity {
private Presenter presenter;
public void onCreate(...) {
presenter= new Presenter ();
presenter.create();
}
public void onDestroy() {
super.onDestroy();
if(presenter!=null){
presenter.destory();
}
}
}
代码是对的,但是现在的问题是presenter 的销毁机制太重复了,我们基本上在每一个界面都需要相同的代码去销毁我们的presenter ,而且,在业务繁多的情况下,有可能还会忘掉写。所以,现在我向大家推荐一个Google 在2018开发者大会上推出的一系列新的架构组件之一的--Lifecycle
正文:Lifecycle 是什么?
Lifecycle 是一个类,它持有关于组件(如 Activity 或 Fragment)生命周期状态的信息,并且允许其他对象观察此状态。
简单的来说,就是它具有生命周期感知能力,能把涉及到Activity或者Fragment 生命周期的操作去抽象到一个类中去执行,而这个类只需要实现LifecycleObserver,然后使用注解标明在对应生命周期执行的方法。talk is cheap ,let me show you the code
首先,添加依赖
compile 'android.arch.lifecycle:extensions:1.0.0'
//presenter 的抽象类
public class BaseAbstractPresenter<T extends BaseView> implements LifecycleObserver {
protected CompositeDisposable compositeDisposable = new CompositeDisposable();
public T mView;
private LifecycleOwner lifecycleOwner;
public BaseAbstractPresenter(T mView, LifecycleOwner lifecycleOwner) {
this.mView = mView;
this.lifecycleOwner = lifecycleOwner;
lifecycleOwner.getLifecycle().addObserver(this);
}
//在清空资源的操作上加上 OnDestroy 生命周期的注解
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void detachView() {
if (compositeDisposable != null) {
compositeDisposable.dispose();
}
lifecycleOwner.getLifecycle().removeObserver(this);
}
}
//Presenter 的实现类
public class MyPresenter extends BaseAbstractPresenter {
public MyPresenter(BaseView mView, LifecycleOwner lifecycleOwner) {
super(mView, lifecycleOwner);
}
}
然后在Activity 中
MyPresenter myPresenter = new MyPresenter(this, this);
就可以了
以下是 log 日志
03-30 15:09:48.318 29537-29537/app.vp.cn.profession I/生命周期: 清空资源,走了onDestroy 方法
03-30 15:09:48.320 29537-29537/app.vp.cn.profession I/生命周期: onDestroy
这样,我们就简洁优雅的实现了自动清空资源的问题,当然,在任何需要控制生命周期的地方,这里都适用。
比方说这个handler
/**
* author : by
* date: 2019/3/26 0026 下午 6:03.
* describe 自动清空资源的handler
*/
public class LifecycleHandler extends Handler implements LifecycleObserver {
private LifecycleOwner lifecycleOwner;
public LifecycleHandler(LifecycleOwner lifecycleOwner) {
this.lifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(Callback callback, LifecycleOwner lifecycleOwner) {
super(callback);
this.lifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(Looper looper, LifecycleOwner lifecycleOwner) {
super(looper);
this.lifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(Looper looper, Callback callback, LifecycleOwner lifecycleOwner) {
super(looper, callback);
this.lifecycleOwner = lifecycleOwner;
addObserver();
}
private void addObserver() {
lifecycleOwner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private void onDestroy() {
removeCallbacksAndMessages(null);
lifecycleOwner.getLifecycle().removeObserver(this);
}
}
在Activity 中:
//这里添加了一个不用回调清空缓存信息的handler ,防止在activity结束的时候 忘记清空hanlder 的缓存
LifecycleHandler lifecycleHandler = new LifecycleHandler(this) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
Log.i("123", "收到信息" + msg.obj);
}
}
};
另外说明一下,Lifecycle 给我们提供了常用的生命周期的注解,足够我们使用,:
public enum Event {
/**
* Constant for onCreate event of the {@link LifecycleOwner}.
*/
ON_CREATE,
/**
* Constant for onStart event of the {@link LifecycleOwner}.
*/
ON_START,
/**
* Constant for onResume event of the {@link LifecycleOwner}.
*/
ON_RESUME,
/**
* Constant for onPause event of the {@link LifecycleOwner}.
*/
ON_PAUSE,
/**
* Constant for onStop event of the {@link LifecycleOwner}.
*/
ON_STOP,
/**
* Constant for onDestroy event of the {@link LifecycleOwner}.
*/
ON_DESTROY,
/**
* An {@link Event Event} constant that can be used to match all events.
*/
ON_ANY
}
好了,今天的文章就到这里,谢谢大家。