1. 场景:延时执行一个方法,使用timer(long delay, TimeUnit unit)
操作符。
如果不指定Observer的线程,则timer操作符的默认接收线程为“RxComputationScheduler-1”(即计算所使用的 Scheduler,非UI线程)。
public class LoginActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Observable.timer(2, TimeUnit.SECONDS)
// .observeOn(AndroidSchedulers.mainThread())
.subscribe(o -> initLogin());
}
private void initLogin() {
// 如果未指定Observer接收线程为UI线程,不可执行UI相关的操作
}
}
2. 倒计时 take(final int count)
操作符
场景:在倒计时功能中,倒计时时间=服务端时间-客户端本地时间,可能会出现负数的现象;
演示代码如下:
@Test
public void testObservable() {
// 注意点
int seconds = -10;
Observable.interval(0, 1, TimeUnit.SECONDS)
.take(seconds + 1)
.map(aLong -> seconds - aLong)
.subscribe(new Observer<Long>() {
@Override
public void onCompleted() {
System.out.println("----onCompleted-----");
}
@Override
public void onError(Throwable e) {
System.out.println("----onError-----");
}
@Override
public void onNext(Long aLong) {
System.out.println(aLong);
}
});
}
}
异常信息如下:
java.lang.IllegalArgumentException: limit >= 0 required but it was -9
at rx.internal.operators.OperatorTake.<init>(OperatorTake.java:40)
at rx.Observable.take(Observable.java:10381)
at com.xk.distribution.ExampleUnitTest.testObservable(ExampleUnitTest.java:170)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
...略...
结论:倒计时的数值不能小于0