一段代码逻辑 用RxJava 的话要咋写

谢邀。我大概提供2种思路。第一种比较常见,一般是在创建操作符里面调用dao.query,随后flatMap,根据传入的值是否为空调用网络请求 or 传入值本身,简单的例子如下: Dao dao = new Dao(); Observable.defer(() -\u0026gt; Observable.just(dao.query()) .flatMap(t -\u0026gt; t != null ? Observable.just(t) : Observable.create(new NetOnSubscribe()))//自定义一个OnSubscribe处理网络 .subscribe();或者也可以选择自己定义一个操作符处理本地的查询结果,其实流程和第一个是类似的。例如:import rx.Observable;import rx.Subscriber;/** * Created by gengwanpeng on 16/4/22. */public class OperatorIfNet\u0026lt;T\u0026gt; implements Observable.Operator\u0026lt;T, T\u0026gt; { @Override public Subscriber\u0026lt;? super T\u0026gt; call(Subscriber\u0026lt;? super T\u0026gt; subscriber) { return new Subscriber\u0026lt;T\u0026gt;(subscriber) { @Override public void onCompleted() { subscriber.onCompleted(); } @Override public void onError(Throwable e) { subscriber.onError(e); } @Override public void onNext(T t) { if(t == null) { HttpContactManager.getNameAndHeadUrlAsync(new DefaultCallback() { @Override public void onSuccess(Object object) { subscriber.onNext((T)object); } @Override public void onFailure(Throwable t){ subscriber.onError(t); } }); }else{ subscriber.onNext(t); } } }; }}调用就这样 Observable.defer(() -\u0026gt; Observable.just(dao.query())) .lift(new OperatorIfNet\u0026lt;\u0026gt;()) .subscribe();当然,别忘了根据需要在合适的地方插上切换线程的代码。还有,上面的operator是随手为之,不要直接用。值得一提的是为什么dao.query()放在defer里面,是让取值操作延迟到subscribe,从而可以切换线程,而不是创建Observable时就调用query()。完。


    推荐阅读