just:任意对象转成Observable
示例:Observable.just(new Object())
</pre><pre code_snippet_id="1723508" snippet_file_name="blog_20160621_1_4487781" name="code" class="java">range(n, m):循环一个数组
示例:Observable.range(1, 4
结果:1,2,3,4
说明:从n到m的连续数组。
</pre><pre code_snippet_id="1723508" snippet_file_name="blog_20160621_1_4487781" name="code" class="java">retryWhen:失败以后重试机制。可以用于网络请求重试
示例:Observable.retryWhen(new RetryWithDelay(5, 1000)
</pre><pre code_snippet_id="1723508" snippet_file_name="blog_20160621_1_4487781" name="code" class="java">
public class RetryWithDelay implements Func1<Observable<? extends Throwable>, Observable<?>> { private final int _maxRetries; private final int _retryDelayMillis; private int _retryCount; public RetryWithDelay(final int maxRetries, final int retryDelayMillis) { _maxRetries = maxRetries; _retryDelayMillis = retryDelayMillis; _retryCount = 0; } // this is a notificationhandler, all that is cared about here // is the emission "type" not emission "content" // only onNext triggers a re-subscription (onError + onComplete kills it) @Override public Observable<?> call(Observable<? extends Throwable> inputObservable) { // it is critical to use inputObservable in the chain for the result // ignoring it and doing your own thing will break the sequence return inputObservable.flatMap(new Func1<Throwable, Observable<?>>() { @Override public Observable<?> call(Throwable throwable) { if (++_retryCount < _maxRetries) { // When this Observable calls onNext, the original // Observable will be retried (i.e. re-subscribed) Timber.d("Retrying in %d ms", _retryCount * _retryDelayMillis); _log(String.format("Retrying in %d ms", _retryCount * _retryDelayMillis)); return Observable.timer(_retryCount * _retryDelayMillis, TimeUnit.MILLISECONDS); } Timber.d("Argh! i give up"); // Max retries hit. Pass an error so the chain is forcibly completed // only onNext triggers a re-subscription (onError + onComplete kills it) return Observable.error(throwable); } }); } }
说明:重试5次,间隔1000毫秒。一般用于网络不好的轮询。
MathObservable:算术和聚合对象
使用:MathObservable .sumInteger(Observable.range(1, 5))
说明:1-5所有数相加的各。
结果:1+2+3+4+5 = 15
注意:range,from一级别的方法,都是在一个线程内完成。走到delay这一步,开始开线程执行,如果有List代表一次开List.size条线程开始定时。所以onNext方法相差的时间差为每条线程的时间差
defer:延迟加载。
i=10; Observable justObservable = Observable.just(i); i=12; Observable deferObservable = Observable.defer(new Func0<Observable<Object>>() { @Override public Observable<Object> call() { return Observable.just(i); } }); i=15; justObservable.subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Object o) { System.out.println("just result:" + o.toString()); } }); deferObservable.subscribe(new Subscriber() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Object o) { System.out.println("defer result:" + o.toString()); } }); }
结果:
just result:10
defer result:15