被观察者和观察者的初始化:
private Observable<String> observable;
private Subscriber<String> subscriber;
/**
* 倒计时开始
*/
private void remainTimeStart() {
observable = Observable.create(new Observable.OnSubscribe<String>(){
@Override
public void call(Subscriber<? super String> subscriber) {
while (remainSeconds > 0) {
System.out.println(System.currentTimeMillis());
subscriber.onNext(DateUtils.getOverTimeBySeconds(remainSeconds));
System.out.println(System.currentTimeMillis());
// 如果需要很精确的时间,需要把getOverTimeBySeconds方法放到主线程或其他子线程去执行
try {
Thread.sleep(1000);
remainSeconds--;
} catch (Exception e) {
e.printStackTrace();
}
}
subscriber.onCompleted();
}
});
subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
tv_remain_time.setText("00:00:00");
// 不能补单了===
}
@Override
public void onError(Throwable throwable) {
tv_remain_time.setText("00:00:00");
}
@Override
public void onNext(String remainStr) {
tv_remain_time.setText(remainStr);
}
};
observable.observeOn(AndroidSchedulers.mainThread())// 在主线程更新UI
.subscribeOn(Schedulers.newThread())
.subscribe(subscriber);
}
如果我们在onDestroy方法中什么都没做,那么关闭当前Activity之后,我们发现后台的线程并没有停止。
即使在onDestroy方法中取消订阅还是没有停止。
@Override
protected void onDestroy() {
super.onDestroy();
remainSeconds = -1;
if (subscriber != null) {
subscriber.unsubscribe();
}
if (observable != null) {
observable.unsubscribeOn(Schedulers.newThread());
}
}
只有在onDestroy方法中执行remainSeconds = -1;线程才抛出异常强制停止。由此看来,RXAndroid框架虽然强大,但是使用不当很容易发生内存泄露,工具是把双刃剑,须谨慎使用。