【传送门】https://www.jianshu.com/p/b1208012b268
【剖析】
【代码】
public class LocationListener implements LifecycleObserver {
private boolean enable;
private LifecycleOwner owner;
private LocationCallBack callBack;
public LocationListener(LifecycleOwner owner, LocationCallBack callBack) {
this.owner = owner;
this.callBack = callBack;
//......
}
//如此则会自动感知生命周期,并调用相应操作
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
if (enable) {
//开始定位,在此之前可能需要检测网络、用户信息、等各种状态,存在耗时,若不用lifecycle时候,就会出现在这里耗时检测
// 而未真的start定位之前,activity就被stop,同时listener也被调用stop,即出现了本listener在start之前调用了stop的异常现象
}
}
public void enable() {
enable = true;
if (owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
//判断,如果没有开始定位,就再次开启定位,定位成功,使用callback回调UI刷新
callBack.onSuccess();
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
//do some stop operate
}
interface LocationCallBack {
void onSuccess();
}
}
【使用】
public class LifeActivity extends AppCompatActivity {
private LocationListener mListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_life);
//AppcompatActivity 的基类 componentActivity实现了lifecycle接口
mListener = new LocationListener(this, () -> {
//更新UI的定位信息
});
//检测网络、用户信息之类的,这里存在耗时,
// Utils.checkInfo(result -> if (result) {
// //检测完成,才会enable,然后listener里面才会真正的start操作
// mListener.enable();
// });
}
/*
这里面就不用onStart 和onStop了,因为lifecycle可自动感知生命周期
@Override
protected void onStart() {
super.onStart();
mListener.onStart();
}
@Override
protected void onStop() {
super.onStop();
mListener.onStop();
}
*/
}