先看如下一段代码:
public class RxAndroidTest {
private static final String TAG = "RxAndroidTest";
public static void test() {
final int[] array = { 1, 3, 5, 7, 9 };
final Disposable disposable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) {
for (int i : array) {
// 跳出循环
if (e.isDisposed())
break;
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
//
}
e.onNext(String.valueOf(i));
Log.d(TAG, "subscribe " + i);
}
// 通知操作结束
e.onComplete();
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
Log.d(TAG, s);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
Log.d(TAG, "onError");
}
}, new Action() {
@Override
public void run() {
// 若不指定observeOn,则与observable在同一线程
Log.d(TAG, "onComplete");
}
});
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 调用dispose后,observable.subscribe仍然会执行
// 但是observer不会执行onNext或onError或onComplete
disposable.dispose();
}
}, 3000);
}
}
分析:
1,Observable的常用构造可以使用Observable.create或Observable.fromCallable。
2,subscribeon指定Observable执行线程,一般指定Schedulers.io()即可,内部会使用线程池执行任务。observeon指定Observer运行线程,AndroidSchedulers.mainThread()表示安卓UI线程。
3,subscribe可以指定多个参数,分别关注onNext,onComplete,onError。
4,ObservableOnSubscribe.subscribe中,e.onNext后会触发Consumer.accept,e.onComplete会触发Action.run。
5,Observable返回的Disposable.dispose后,那么,从Observable到Observer之间的连接中断,Observable仍旧会运行,但Observer得不到结果。
6,在Observable内部运行时检测状态,发现isDisposed后跳出循环。