这篇文章是根据官方文档演化而来。比如我们有这样一个需求,目前比较流行的网络请求框架okhttp,虽然官方给了很好的实例,但是拿到实际的项目上,还需要二次封装,那么会遇到一个问题:如何管理请求的生命周期,也就是说,如何在界面销毁的时候,不要返回数据到UI层?这就需要LifeCycle闪亮登场了。
首先需要了解几个类的概念:
- LifecycleOwner:LifecycleOwner 是单一方法接口,表示类具有 Lifecycle。它具有一种方法(即 getLifecycle()),该方法必须由类实现,它具有管理生命周期的能力。
- LifecycleObserver:实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件无缝协同工作,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。
一、LifecycleObserver
public class CallbackImpl implements LifecycleObserver {
private Lifecycle mLifecycle;
private MyCallback mMyCallback;
public CallbackImpl(MyCallback myCallback, Lifecycle lifecycle) {
this.mMyCallback = myCallback;
this.mLifecycle = lifecycle;
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void connectCallback() {
Log.e("MyLifeCycleActivity","建立连接");
setEnable(true);
if(isEnable()){
//模拟数据回调
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if(mLifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED) ) {
mMyCallback.callBack(111);
}
}
},5000);
}
}
private boolean enable;
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectCallback() {
Log.e("MyLifeCycleActivity","断开连接");
// setEnable(false);
}
public interface MyCallback {
void callBack(int pos);
}
}
里面有两个重要的方法connectCallback(),disconnectCallback()。并添加了生命周期的注解。延迟5s后、通知UI更新,这样为了我们有足够的时间进行测试。
二、activity实现LifecycleOwner接口
public class MyLifeCycleActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new CallbackImpl(new CallbackImpl.MyCallback() {
@Override
public void callBack(int pos) {
Log.e("MyLifeCycleActivity", "数据收到了》》》 " + pos);
}
}, getLifecycle()));
}
}
在onCreate()方法中把当前activity的LifeCycle传递给CallbackImpl ,这样就把生命周期和CallbackImpl 方法进行了绑定。在onPause()方法中,解除绑定。
三、测试
1、5s后应用回到后台
正常打印
2、5s内应用回到后台
回调数据就再也收不到了。