package com.mcxtzhang.rxjava2demo.rxjava2; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import com.mcxtzhang.rxjava2demo.R; import java.util.ArrayList; import java.util.EmptyStackException; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import io.reactivex.Completable; import io.reactivex.CompletableEmitter; import io.reactivex.CompletableObserver; import io.reactivex.CompletableOnSubscribe; import io.reactivex.Maybe; import io.reactivex.MaybeObserver; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.ObservableSource; import io.reactivex.Observer; import io.reactivex.Single; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Action; import io.reactivex.functions.BiConsumer; import io.reactivex.functions.BiFunction; import io.reactivex.functions.Consumer; import io.reactivex.functions.Function; import io.reactivex.functions.Predicate; import io.reactivex.observables.ConnectableObservable; import io.reactivex.observers.DisposableMaybeObserver; import io.reactivex.observers.DisposableObserver; import io.reactivex.observers.DisposableSingleObserver; import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.ReplaySubject; import io.reactivex.subjects.Subject; public class Rx2Activity extends AppCompatActivity { private static final String TAG = "zxt/Rx2"; //▲ 统一管理 Disposable,统一注销 CompositeDisposable mCompositeDisposable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_rx2); mCompositeDisposable = new CompositeDisposable(); findViewById(R.id.btnInterval).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.interval(0, 1, TimeUnit.SECONDS) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { mCompositeDisposable.add(d); Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(Long value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); findViewById(R.id.btnLeak).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { /* for (int i = 0; ; i++) { if (null != e && !e.isDisposed()) { Log.e(TAG, "subscribe() called with: e = [" + e + "]" + Thread.currentThread()); e.onNext(i); } else { Log.e(TAG, "subscribe: break!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); e.onComplete(); break; } //Thread.sleep(500); }*/ e.onNext(5); e.onError(new Exception("abc")); } }).subscribeOn(Schedulers.computation()) .observeOn(Schedulers.io()) .subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } } , new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.d(TAG, "accept() called with: throwable = [" + throwable + "]"); } }); } }); findViewById(R.id.btnStop).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCompositeDisposable.dispose(); Observable.just(1, 2, 3, 4) .filter(new Predicate<Integer>() { @Override public boolean test(Integer integer) throws Exception { return false; } }); } }); /* findViewById(R.id.btnLeak).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; ; i++) { Log.d(TAG, "run() called"); } } }).start(); } });*/ findViewById(R.id.btnZipDemo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<String> ob1 = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onError(new EmptyStackException()); } }); Observable<String> ob2 = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("能收到吗?"); e.onNext("我猜你能收到吧?"); e.onComplete(); } }); Observable<String> zip = Observable.zip(ob1, ob2, new BiFunction<String, String, String>() { @Override public String apply(String s, String s2) throws Exception { return s + s2; } }); Single<List<String>> collect = ob1.flatMap(new Function<String, ObservableSource<String>>() { @Override public ObservableSource<String> apply(String s) throws Exception { return Observable.just(s); } }).filter(new Predicate<String>() { @Override public boolean test(String s) throws Exception { return true; } }).collect(new Callable<List<String>>() { @Override public List<String> call() throws Exception { return new ArrayList<String>(); } }, new BiConsumer<List<String>, String>() { @Override public void accept(List<String> strings, String s) throws Exception { strings.add(s); } }); Single.zip(Single.fromObservable(zip), collect, new BiFunction<String, List<String>, String>() { @Override public String apply(String s, List<String> strings) throws Exception { return s; } }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new SingleObserver<String>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onSuccess(String value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } }); } }); deferValue = 1; final Observable<Integer> o1 = /*Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(deferValue); e.onComplete(); } })*/Observable.fromArray(deferValue).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()); final Observable<Integer> o2 = Observable.defer(new Callable<ObservableSource<Integer>>() { @Override public ObservableSource<Integer> call() throws Exception { return Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { e.onNext(deferValue); e.onComplete(); } }); } }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()); findViewById(R.id.btnDefer).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { deferValue += 1; o1.subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } }); o2.subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } }); } }); findViewById(R.id.btnRangeRepeat).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.range(5, 9).repeat(2).subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } }); } }); findViewById(R.id.btnSubject).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ReplaySubject<String> subject = ReplaySubject.create(); String a = "一开始没变化之前"; subject.onNext("a"); Log.d(TAG, "onClick() called with: view = [" + subject.getValues() + "]"); subject.onNext("b"); subject.onNext(a); Log.d(TAG, "onClick() called with: view = [" + subject.getValues() + "]"); subject.onComplete(); a = "厉害了"; subject.subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { mCompositeDisposable.add(d); Log.d(TAG, "onSubscribe() called with: d = [" + d + "]" + Thread.currentThread()); } @Override public void onNext(String value) { Log.d(TAG, "onNext() called with: value = [" + value + "]" + Thread.currentThread()); mCompositeDisposable.dispose(); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]" + Thread.currentThread()); } @Override public void onComplete() { Log.d(TAG, "onComplete() called" + Thread.currentThread()); } }); } }); findViewById(R.id.btnFlatmap).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { query("查询") .flatMap(new Function<List<String>, ObservableSource<String>>() { @Override public ObservableSource<String> apply(List<String> strings) throws Exception { return Observable.fromIterable(strings); } }) .flatMap(new Function<String, ObservableSource<String>>() { @Override public ObservableSource<String> apply(String s) throws Exception { return getTitle(s); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.d(TAG, "doOnNext() called with: s = [" + s + "]" + Thread.currentThread()); } }) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.d(TAG, "subscribe() called with: s = [" + s + "]" + Thread.currentThread()); } }); } }); findViewById(R.id.btnTimer).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.timer(1, TimeUnit.SECONDS) .subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(Long value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); final Observable<Integer> testTakeOb = Observable.just(1, 2, 3, 4, 5, 6, 7, 1) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); final Observer<Integer> testTaskObserver = new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.w(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(Integer value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.e(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.e(TAG, "onComplete() called"); } }; findViewById(R.id.btnTakeUntil).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { testTakeOb .takeUntil(new Predicate<Integer>() { @Override public boolean test(Integer integer) throws Exception { Log.i(TAG, "takeUntil() called with: integer = [" + integer + "]"); return integer > 2; } }) .subscribe(testTaskObserver); } }); findViewById(R.id.btnTakeWhile).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { testTakeOb.takeWhile(new Predicate<Integer>() { @Override public boolean test(Integer integer) throws Exception { Log.d(TAG, "takeWhile() called with: integer = [" + integer + "]"); return integer < 2; } }).subscribe(testTaskObserver); Observable.just(1, 2, 3, 2, 1) .takeUntil(new Predicate<Integer>() { @Override public boolean test(Integer integer) throws Exception { Log.d(TAG, "test() called with: integer = [" + integer + "]"); return integer > 1; } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(Integer value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); final DisposableObserver observer = new DisposableObserver() { @Override public void onNext(Object value) { Log.v(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.e(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.w(TAG, "onComplete() called"); } }; findViewById(R.id.btnReduce).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* Observable.just(4, 2, 3, 4, 5, 7) .reduce(new BiFunction<Integer, Integer, Integer>() { @Override public Integer apply(Integer integer, Integer integer2) throws Exception { Log.i(TAG, "apply() called with: integer = [" + integer + "], integer2 = [" + integer2 + "]"); return integer>integer2?integer:integer2; } }) .subscribeWith(new DisposableMaybeObserver<Integer>() { @Override public void onSuccess(Integer value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); // 01-12 22:29:30.879 27202-27202/com.mcxtzhang.rxjava2demo I/zxt/Rx2: apply() called with: integer = [4], integer2 = [2] // 01-12 22:29:30.879 27202-27202/com.mcxtzhang.rxjava2demo I/zxt/Rx2: apply() called with: integer = [4], integer2 = [3] // 01-12 22:29:30.879 27202-27202/com.mcxtzhang.rxjava2demo I/zxt/Rx2: apply() called with: integer = [4], integer2 = [4] // 01-12 22:29:30.879 27202-27202/com.mcxtzhang.rxjava2demo I/zxt/Rx2: apply() called with: integer = [4], integer2 = [5] // 01-12 22:29:30.879 27202-27202/com.mcxtzhang.rxjava2demo I/zxt/Rx2: apply() called with: integer = [5], integer2 = [7] // 01-12 22:29:30.885 27202-27202/com.mcxtzhang.rxjava2demo D/zxt/Rx2: onSuccess() called with: value = [7]*/ DisposableMaybeObserver<Integer> maybeObserver = new DisposableMaybeObserver<Integer>() { @Override public void onSuccess(Integer value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }; Observable.just(4, 2, 3, 4, 5, 7).reduce("a", new BiFunction<String, Integer, String>() { @Override public String apply(String s, Integer integer) throws Exception { Log.d(TAG, "apply() called with: s = [" + s + "], integer = [" + integer + "]"); return s + integer; } }).subscribeWith(new DisposableSingleObserver<String>() { @Override public void onSuccess(String value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } }); // 01-12 22:35:17.808 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a], integer = [4] // 01-12 22:35:17.808 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a4], integer = [2] // 01-12 22:35:17.808 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a42], integer = [3] // 01-12 22:35:17.808 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a423], integer = [4] // 01-12 22:35:17.809 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a4234], integer = [5] // 01-12 22:35:17.809 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: apply() called with: s = [a42345], integer = [7] // 01-12 22:35:17.809 28076-28076/com.mcxtzhang.rxjava2demo D/zxt/Rx2: onSuccess() called with: value = [a423457] } }); findViewById(R.id.btnToMap).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //即使不指定用新的map 订阅两次 也是两个hashmap对象 Single<Map<Integer, String>> mapSingle = Observable.just(1, 2, 3, 4, 5) .toMap(new Function<Integer, Integer>() { @Override public Integer apply(Integer integer) throws Exception { return integer; } }, new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { return "" + integer; } }/*, new Callable<Map<Integer, String>>() { @Override public Map<Integer, String> call() throws Exception { return new HashMap<Integer, String>(); } }*/); Single<Map<Integer, String>> mapSingle1 = Subject.just(1, 2, 3, 4, 5, 6, 7) .toMap(new Function<Integer, Integer>() { @Override public Integer apply(Integer integer) throws Exception { Log.e(TAG, "apply() called with: integer = [" + integer + "]"); return integer; } }, new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { Log.w(TAG, "apply() called with: integer = [" + integer + "]"); return "" + integer; } }); mapSingle1.subscribeWith(new DisposableSingleObserver<Map<Integer, String>>() { @Override public void onSuccess(Map<Integer, String> value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } }); mapSingle1.subscribeWith(new DisposableSingleObserver<Map<Integer, String>>() { @Override public void onSuccess(Map<Integer, String> value) { Log.d(TAG, "onSuccess() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } }); } }); //cast/ofType(强转类型的) findViewById(R.id.btnCast).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TestCastBaseBean testCastBaseBean = new TestCastChildBean(); TestCastBaseBean testCastBaseBean1 = new TestCastBaseBean(); TestCastBaseBean testCastBaseBean2 = new TestCastChildBean(); Observable.just(testCastBaseBean, testCastBaseBean1, testCastBaseBean2) .ofType(TestCastChildBean.class) .subscribe(new Consumer<TestCastChildBean>() { @Override public void accept(TestCastChildBean testCastChildBean) throws Exception { Log.d(TAG, "accept() called with: testCastChildBean = [" + testCastChildBean.father + "]"); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { Log.e(TAG, "accept() called with: throwable = [" + throwable + "]"); } }); } }); //empty(测试empty会回调观察者里那些方法) findViewById(R.id.btnEmpty).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.empty().subscribe(observer); //01-13 11:35:03.816 4130-4130/com.mcxtzhang.rxjava2demo W/zxt/Rx2: onComplete() called } }); Log.d(TAG, "onCreate() called with: savedInstanceState = [" + getWindow() + "]"); findViewById(R.id.btnPublish).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { cold = Observable.interval(200, TimeUnit.MILLISECONDS).publish(); d0 = cold.connect(); d1 = cold.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.w(TAG, "11111() called with: aLong = [" + aLong + "]"); } }); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } d2 = cold.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.e(TAG, "22222() called with: aLong = [" + aLong + "]"); } }); } }); findViewById(R.id.btnStopHot).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (d0.isDisposed()) { // useless i don't know why d0 = cold.connect(); } else { d0.dispose(); } } }); findViewById(R.id.btnScan).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<String> values = Observable.just("一", "二", "三"); // 这里第一个默认值的数据 会先发出去,然后再进入apply Observable<Indexed<String>> scan = values.scan(new Indexed<String>(10, null) , new BiFunction<Indexed<String>, String, Indexed<String>>() { @Override public Indexed<String> apply(Indexed<String> stringIndexed, String s) throws Exception { Log.e(TAG, "scan() called with: stringIndexed = [" + stringIndexed + "], s = [" + s + "]"); return new Indexed<String>(stringIndexed.index + 1, s); } }); scan.subscribe(new Consumer<Indexed<String>>() { @Override public void accept(Indexed<String> stringIndexed) throws Exception { Log.d(TAG, "111accept() called with: stringIndexed = [" + stringIndexed + "]"); } }); scan.subscribe(new Consumer<Indexed<String>>() { @Override public void accept(Indexed<String> stringIndexed) throws Exception { Log.d(TAG, "222accept() called with: stringIndexed = [" + stringIndexed + "]"); } }); } }); //▲ onErrorReturn(测试结果:发生错误 后面onNext不再执行) findViewById(R.id.btnErrorReturn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { if (!e.isDisposed()) { e.onNext(1); e.onNext(2); e.onError(new Exception("测试错误")); e.onNext(3); e.onComplete(); } } }).onErrorReturn(new Function<Throwable, Integer>() { @Override public Integer apply(Throwable throwable) throws Exception { return 5; } }).subscribeWith(observer); } }); /* 01-19 19:11:29.866 25188-25188/com.mcxtzhang.rxjava2demo V/zxt/Rx2: onNext() called with: value = [1] 01-19 19:11:29.866 25188-25188/com.mcxtzhang.rxjava2demo V/zxt/Rx2: onNext() called with: value = [2] 01-19 19:11:29.866 25188-25188/com.mcxtzhang.rxjava2demo V/zxt/Rx2: onNext() called with: value = [5] 01-19 19:11:29.866 25188-25188/com.mcxtzhang.rxjava2demo W/zxt/Rx2: onComplete() called*/ final Observable<Integer> testError = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { if (!e.isDisposed()) { e.onNext(1); e.onNext(2); e.onError(new Exception("测试错误")); e.onNext(3); e.onComplete(); } } }); findViewById(R.id.btnOnErrorResumeNext).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* testError .onErrorResumeNext(new Function<Throwable, ObservableSource<? extends Integer>>() { @Override public ObservableSource<? extends Integer> apply(Throwable throwable) throws Exception { return Observable.just(5, 6, 7); } }).subscribeWith(observer);*/ testError .onErrorResumeNext(Observable.just(8, 9, 0)) .subscribeWith(observer); } }); findViewById(R.id.btnRetry).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { testError.retry(2).subscribeWith(observer); } }); findViewById(R.id.btnRetryWhen).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { testError.retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() { @Override public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception { return throwableObservable .take(6) .delay(100, TimeUnit.MICROSECONDS); } }).subscribeWith(observer); } }); findViewById(R.id.btnSwitchOnNext).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.switchOnNext(new Observable<ObservableSource<?>>() { @Override protected void subscribeActual(Observer<? super ObservableSource<?>> observer) { observer.onNext(Observable.just(1, 2, 3)); observer.onNext(Observable.just(11, 22, 33)); observer.onComplete(); } }).subscribe(observer); } }); //▲ 使用buffer后,数据成为List类型 findViewById(R.id.btnBuffer).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* DisposableObserver disposableObserver = Observable.interval(0, 100, TimeUnit.MILLISECONDS) .buffer(2) .subscribeWith(observer); mCompositeDisposable.add(disposableObserver);*/ //when oble1/obelBuffer2 onSubscribe , Observable<Integer> oble1 = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { Log.d(TAG, "subscribe() called with: e = [" + e + "]"); e.onNext(1); e.onNext(2); e.onComplete(); } }); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "begin buffer"); Observable<List<Integer>> oberBuffer2 = oble1.buffer(1); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "after buffer and subscribe with"); oberBuffer2.subscribeWith(observer); } }); //▲ 使用window后,数据成为Observable类型 //再merge到一起 就和以前没经过window的一样了 findViewById(R.id.btnWindow).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.merge(Observable.range(0, 5) .window(3, 1)) .subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } }); } }); findViewById(R.id.btnConcatFirst).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.concat(Observable.range(0, 5), Observable.range(6, 10)) //加上只取第一个 0 ,不加上输出15个数字 //.firstElement() .subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { Log.d(TAG, "accept() called with: integer = [" + integer + "]"); } }); } }); findViewById(R.id.btnCache).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<Long> cacheObservable = Observable.interval(200, 100, TimeUnit.MILLISECONDS) .take(5) .doOnNext(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "doOnNext() called with: aLong = [" + aLong + "]"); } }) .cache() .doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { Log.d(TAG, "doOnSubscribe() called with: disposable = [" + disposable + "]"); } }) .doOnDispose(new Action() { @Override public void run() throws Exception { Log.d(TAG, "doOnDispose() called"); } }); Disposable subscribe = cacheObservable.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "subscribe() called with: aLong = [" + aLong + "]"); } }); mCompositeDisposable.add(subscribe); try { Thread.sleep(250); } catch (InterruptedException e) { e.printStackTrace(); } mCompositeDisposable.clear(); } }); //▲Replay(取消订阅后,Replay内部默认继续走,但是如果把connect返回后的Disposable 加入 管理,取消 就可以了) findViewById(R.id.btnReplay).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ConnectableObservable<Long> cacheObservable = Observable.interval(200, 100, TimeUnit.MILLISECONDS) .take(5) .doOnNext(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "doOnNext() called with: aLong = [" + aLong + "]"); } }) .replay(4); //Replay(取消订阅后,Replay内部默认继续走,但是如果把connect返回后的Disposable 加入 管理,取消 就可以了) Disposable cacheConnect = cacheObservable.connect(); mCompositeDisposable.add(cacheConnect); Observable<Long> wraperCacheOb = cacheObservable.doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { Log.d(TAG, "doOnSubscribe() called with: disposable = [" + disposable + "]"); } }) .doOnDispose(new Action() { @Override public void run() throws Exception { Log.d(TAG, "doOnDispose() called"); } }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()); Disposable subscribe1 = wraperCacheOb.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "subscribe1() called with: aLong = [" + aLong + "]"); } }); mCompositeDisposable.add(subscribe1); try { Thread.sleep(450); } catch (InterruptedException e) { e.printStackTrace(); } Disposable subscribe2 = wraperCacheOb.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "subscribe2() called with: aLong = [" + aLong + "]"); } }); //mCompositeDisposable.clear(); } }); findViewById(R.id.btnReplayCompare).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<Long> longObservable = Observable.interval(200, 100, TimeUnit.MILLISECONDS) .take(5) .doOnNext(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "doOnNext() called with: aLong = [" + aLong + "]"); } }).doOnSubscribe(new Consumer<Disposable>() { @Override public void accept(Disposable disposable) throws Exception { Log.d(TAG, "doOnSubscribe() called with: disposable = [" + disposable + "]"); } }) .doOnDispose(new Action() { @Override public void run() throws Exception { Log.d(TAG, "doOnDispose() called"); } }).subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()); longObservable.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "accept111111111() called with: aLong = [" + aLong + "]"); } }); try { Thread.sleep(450); } catch (InterruptedException e) { e.printStackTrace(); } longObservable.subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { Log.d(TAG, "accept22222222222222222222() called with: aLong = [" + aLong + "]"); } }); } }); //▲ Completable **类似于返回值为 void 的方法**。 它要么成功完成但是没有数据返回,要么就抛出异常, findViewById(R.id.btnCompletable).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Completable.create(new CompletableOnSubscribe() { @Override public void subscribe(CompletableEmitter e) throws Exception { } }).subscribe(new CompletableObserver() { @Override public void onSubscribe(Disposable d) { } @Override public void onComplete() { } @Override public void onError(Throwable e) { } }); } }); findViewById(R.id.btnMaybe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Maybe.just(1) .subscribe(new MaybeObserver<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override public void onSuccess(Integer value) { } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }); findViewById(R.id.btnObserverOnAndMap).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.just(1, 2) .map(new Function<Integer, Integer>() { @Override public Integer apply(Integer integer) throws Exception { Log.d(TAG, "before apply() called with: integer = [" + integer + "]" + Thread.currentThread()); return integer; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { Log.d(TAG, "map() called with: integer = [" + integer + "]" + Thread.currentThread()); return integer + ""; } }) .subscribe(new Consumer<String>() { @Override public void accept(String s) throws Exception { Log.d(TAG, "Consumer() called with: s = [" + s + "]" + Thread.currentThread()); } }); } }); final Observable<String> just = Observable.defer(new Callable<ObservableSource<String>>() { @Override public ObservableSource<String> call() throws Exception { return Observable.just(getJustData()); } }); findViewById(R.id.btnWhenJust).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { just.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(String value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); final Observable<String> testCreateObservable = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { Log.d(TAG, "subscribe() called with: e = [" + e + "]" + Thread.currentThread()); /* e.setCancellable(new Cancellable() { @Override public void cancel() throws Exception { Toast.makeText(Rx2Activity.this, "kafhklasas", Toast.LENGTH_SHORT).show(); } });*/ e.onNext("1"); //先error后complete,complete不显示。 反之 会crash //e.onError(new IOException("sb error")); e.onComplete(); // e.onError(new IOException("sb error")); } }); findViewById(R.id.btnCreate2Subscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { testCreateObservable.subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(String value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); findViewById(R.id.btnCreate2SubscribeWith).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { d0 = testCreateObservable .subscribeWith(new DisposableObserver<String>() { @Override public void onNext(String value) { } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); view.postDelayed(new Runnable() { @Override public void run() { d0.dispose(); } }, 2000); } }); //测试加入操作符map后 findViewById(R.id.btnCreate2map2Subscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<Integer> map = testCreateObservable.map(new Function<String, Integer>() { @Override public Integer apply(String s) throws Exception { return Integer.parseInt(s); } }); map.subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); } @Override public void onNext(Integer value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); Consumer<Throwable> errorHandler = RxJavaPlugins.getErrorHandler(); BiFunction<Observable, Observer, Observer> onObservableSubscribe = RxJavaPlugins.getOnObservableSubscribe(); Function<Observable, Observable> onObservableAssembly = RxJavaPlugins.getOnObservableAssembly(); Log.e(TAG, "errorHandler = [" + errorHandler + "]"); Log.e(TAG, "onObservableSubscribe = [" + onObservableSubscribe + "]"); Log.e(TAG, "onObservableAssembly = [" + onObservableAssembly + "]"); findViewById(R.id.btnCreate2flatMap2Subscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable<Integer> flatMapObservable = Observable.just(1, 2, 3) .flatMap(new Function<Integer, ObservableSource<Integer>>() { @Override public ObservableSource<Integer> apply(Integer integer) throws Exception { return Observable.just(integer, integer, integer); } }); flatMapObservable.subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(Integer value) { } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }); findViewById(R.id.btnCreate2subscribeOn2Subscribe).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { Log.d(TAG, "subscribe() called with: e = [" + e + "]" + Thread.currentThread()); e.onNext("1"); e.onNext("2"); e.onNext("3"); e.onNext("4"); e.onNext("5"); e.onNext("6"); e.onNext("7"); e.onComplete(); } }).subscribeOn(Schedulers.io())/*.subscribeOn(Schedulers.io()) .map(new Function<String, String>() { @Override public String apply(String s) throws Exception { //依然是io线程 Log.d(TAG, "apply() called with: s = [" + s + "]" + Thread.currentThread()); return s; } }) .subscribeOn(Schedulers.computation())*/ //在上一节的基础上,增加一个ObserveOn .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]" + Thread.currentThread()); } @Override public void onNext(String value) { Log.d(TAG, "onNext() called with: value = [" + value + "]" + Thread.currentThread()); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]" + Thread.currentThread()); } @Override public void onComplete() { Log.d(TAG, "onComplete() called" + Thread.currentThread()); } }); /* view.postDelayed(new Runnable() { @Override public void run() { d0.dispose(); } }, 2000);*/ } }); findViewById(R.id.btnIntervalChangeGap).setOnClickListener(new View.OnClickListener() { int time = 1000; @Override public void onClick(View view) { //Observable.just(500, 500+1000,500+1000+1500 ) //定时5秒后执行,然后10秒后执行,最后15秒后执行, Observable.just(5000, 1000, 15000) .scan(new BiFunction<Integer, Integer, Integer>() { @Override public Integer apply(Integer integer, Integer integer2) throws Exception { Log.d(TAG, "apply() called with: integer = [" + integer + "], integer2 = [" + integer2 + "]"); return integer + integer2; } }) .flatMap(new Function<Integer, ObservableSource<Long>>() { @Override public ObservableSource<Long> apply(Integer integer) throws Exception { Log.d(TAG, "apply() called with: integer = [" + integer + "]"); return Observable.timer(integer, TimeUnit.MILLISECONDS); } }).subscribe(new Observer<Long>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, "onSubscribe() called with: d = [" + d + "]"); Log.d(TAG, "onSubscribe() called with: d = [" + System.currentTimeMillis() + "]"); } @Override public void onNext(Long value) { Log.d(TAG, "onNext() called with: value = [" + value + "]"); Log.d(TAG, "onSubscribe() called with: d = [" + System.currentTimeMillis() + "]"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError() called with: e = [" + e + "]"); } @Override public void onComplete() { Log.d(TAG, "onComplete() called"); } }); } }); } private String getJustData() { Log.d(TAG, "getJustData() called"); return "btnWhenJust"; } //for test hot cold Observable Disposable d0, d1, d2; ConnectableObservable<Long> cold; private int deferValue, value; @Override protected void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy: "); //mCompositeDisposable.clear(); mCompositeDisposable.dispose(); } //Flatmap //这个方法根据输入的字符串返回一个网站的url列表 Observable<List<String>> query(final String text) { return Observable.create(new ObservableOnSubscribe<List<String>>() { @Override public void subscribe(ObservableEmitter<List<String>> e) throws Exception { if (!e.isDisposed()) { Log.d(TAG, "subscribe() called with: e = [" + e + "]" + Thread.currentThread()); List<String> result = new ArrayList<String>(); result.add(text + "A"); result.add(text + "B"); result.add(text + "C"); e.onNext(result); e.onComplete(); } } }); } // 返回网站的标题,如果404了就返回null Observable<String> getTitle(final String URL) { return Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { e.onNext("标题:" + URL); e.onComplete(); } }); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume() called + getWindow()" + getWindow()); } }