响应组件的生命周期
在MVP
模式中,常需要在Presenter
里响应Activity
或者Fragment
的生命周期,对应做一些处理。比如在Presenter
里发起了一个网络请求,请求还在进行,而用户点击了返回按钮要退出当前Activity
,这时最好能在Presenter
中取消当前请求,也就是说,要在Presenter
中响应Activity
的onDestroy
方法,在Activity
销毁时取消仍在进行的网络请求。
如果我们要自己来实现上面的需求,并不困难,只是用起来比较麻烦。现在,谷歌官方推出了一个Lifecycle
组件,非常简单易用。其所在的包名为:android.arch.lifecycle
,其中需要重点关注的几个类或者接口如下:
- 抽象类
Lifecycle
- 类
LifecycleRegistry
- 接口
LifecycleOwner
- 接口
LifecycleObserver
Lifecycle抽象类
Lifecycle
类中定义了组件的生命周期参数并提供了让其它对象来观察当前组件状态的方法addObserver(LifecycleObserver observer)
。
Lifecycle
类中使用两个枚举类型Event
和State
来定义组件的生命周期其当前状态。
- Event 枚举参数对应于
Activity
或Fragment
的生命周期回调方法
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
- State 枚举参数对应于当前组件的生命状态
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
State和Event关系类似于下图
LifecycleOwner接口
LifecycleOwner
接口中只定义了一个方法getLifecycle()
,通过这个方法可以获取到一个Lifecycle
对象。如果组件想拥有Lifecycle
中定义的生命周期,就需要实现LifecycleOwner
接口,目前AppCompatActivity
和Fragment
都已经实现了这个接口,因此在Activity或Fragment中可以直接调用getLifecycle
方法。
LifecycleObserver
当一个类实现了LifecycleObserver
接口,就能通过Lifecycle.add(LifecycleObserver observer)
方法把它添加为观察对象。就可以在该类中观察组件的生命周期。比如定义一个BasePresenter
类,让它实现LifecycleObserver
接口,就能通过注解获取被观察组件的生命周期回调,代码如下:
public class BasePresenter implements LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate(){};
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart(){};
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume(){};
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause(){};
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop(){};
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy(){};
}
然后在AppCompatActivity
中,初始化BasePresenter
并通过Lifecycle.addObserver(LifecycleObserver observer)
方法把BasePresenter
添加为观察者,那么在BasePresenter
中就能获取到当前Activity
的所有生命周期回调。代码如下:
private TestPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPresenter = new TestPresenter();
getLifecycle().addObserver(mPresenter);
}
这里的TestPresenter
是继承自BasePresenter
的,代码如下:
public class TestPresenter extends BasePresenter {
private static final String TAG = "TestPresenter";
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy");
}
}
在TestPresenter
里只实现了两个方法,只监听了onCreate
和onDestroy
。代码运行后,启动并退出被观察的Activity,打印结果如下:
05-10 16:19:28.902 /xiaoqiang.com.trysomething E/TestPresenter: onCreate
05-10 16:19:31.222 /xiaoqiang.com.trysomething E/TestPresenter: onDestroy
LifecycleRegistry
通过上面的讲解,我们已经知道了如何让其它对象监听Activity
或者Fragment
的生命周期,然而难道我们只能监听Activity
和Fragment
吗?当然不是的,有了LifecycleOwner
,我们就能给任何对象添加或者说定义生命周期,然后通过LifecycleObserver
去监听它。而要给一个对象添加生命周期,就需要用到LifecycleRigistry
类。
其使用方法如下:
public class CustomLifecycle implements LifecycleOwner{
private LifecycleRegistry mLifecycleRegistry;
TestPresenter presenter;
public CustomLifecycle(){
mLifecycleRegistry = new LifecycleRegistry(this);
presenter = new TestPresenter();
getLifecycle().addObserver(presenter);
}
public void start(){
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
public void doRecycle(){
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
}
}
在CustomLifecycle
类中定义了两个方法start()
和doRecycle()
,然后通过LifecycleRigistry.markState(State state)
方法分别将它们标记为生命周期的CREATED
阶段和DESTROYED
阶段,这样,CustomLifecyle
类就拥有了两个生命周期方法,根据上面的Event
和State
关系图,当CustomLifecycle
调用start()
方法时,Lifecycle.Event.ON_CREATE
就会响应,当调用doRecycle()
方法时,Lifecycle.Event.ON_DESTROY
就会响应。
仍然使用TestPresenter来监听生命周期,初始化CustomLifecyle
类,依次调用start()
和doRecycle()
方法:
private void tryLifecycle(){
CustomLifecycle lifecycle = new CustomLifecycle();
lifecycle.start();
new Handler().postDelayed(()-> lifecycle.doRecycle(), 1000);
}
日志打印结果如下:
05-10 16:53:44.142 /xiaoqiang.com.trysomething E/TestPresenter: onCreate
05-10 16:53:45.152 /xiaoqiang.com.trysomething E/TestPresenter: onDestroy
使用官方这套
Lifecycle
组件,可以让任意对象轻松实现对Activity
、Fragment
生命周期的监听。同时也能给任意对象赋予生命周期并实现对其生命周期的监听,用起来简直不要太方便。