以前写倒计时恐怕都是使用Timer或者Handler,后来有了RxJava后都会选择使用RxJava来操作,可是无论哪一种,都要在页面销毁的时候去做对应的处理,多个页面都用到的话代码就显得冗余,Android的Jetpack中有了lifecycle之后就可以优雅的处理这些问题了,而且从26之后AppCompatActivity以及Fragment已经默认实现了LifecycleOwner接口,我们可以直接使用getLifecycle().addObserver(LifecycleObserver observer);
涉及知识点:RxJava操作符,RxJava线程调度,Lifecycle,单例(内部类实现方式)
lifecycle的具体使用请参考官方文档:developer.android.google.cn/topic/libra…
public class CountDownManager implements LifecycleObserver {
DisposableObserver disposableObserver;
private CountDownManager() {
}
private static class Holder {
private static final CountDownManager instance = new CountDownManager();
}
//高版本的UIController默认已经实现了LifecycleOwner接口,可以直接监听生命周期
//想要使用的话必须在UIController里面使用getLifecycle().addObserver(CountDownManager.getInstance());
// getLifecycle() UIController自带方法
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void destroy(){
cacelCallback();
}
public static CountDownManager getInstance() {
return Holder.instance;
}
@SuppressLint("CheckResult")
public CountDownManager startCountDown(@NonNull int time) {
disposableObserver = Observable.interval(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.take(time)
.map(aLong -> time - aLong)
.subscribeWith(new DisposableObserver<Long>() {
@Override
public void onNext(Long aLong) {
if (callback != null)
callback.onNext(aLong);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
if (callback != null)
callback.onComplete();
}
});
return this;
}
private callback callback;
public void setCallback(CountDownManager.callback callback) {
this.callback = callback;
}
public void cacelCallback() {
if (null != disposableObserver && !disposableObserver.isDisposed()) {
disposableObserver.dispose();
}
}
public interface callback {
void onNext(Long time);
void onComplete();
}
}
复制代码
如何使用? 以Activity为例
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLifecycle().addObserver(CountDownManager.getInstance());
CountDownManager.getInstance().startCountDown(10).setCallback(new CountDownManager.callback() {
@Override
public void onNext(Long time) {
// Callbacks per second,you can do something here
}
@Override
public void onComplete() {
// complete
}
});
}
复制代码
如果没在Activity或者Fragment中可以在适当的时机调用
CountDownManager.getInstance().cacelCallback();
复制代码
想要了解更多lifecycle,请点击:developer.android.google.cn/topic/libra…