android - RxJava的使用问题。
问题描述
更新叙述一下需求,其实就是简单的
取数据的时候先判断本地有无缓存,有缓存则从数据库中取得,否则从网络请求并且保存到本地。
因为才接触rxjava,这样写目前倒是完成了功能(运转正常),但是这样写真的是合理的吗?本地数据库查询 queryDP如果没查询到数据 deepSpaceBean=null onNext(deepSpaceBean)
@Override public Observable getDP(final String date) {return Observable.create(new Observable.OnSubscribe<DeepSpaceBean>() { @Override public void call(Subscriber<? super DeepSpaceBean> subscriber) {DeepSpaceBean deepSpaceBean = null;try { deepSpaceBean = queryDP(date);} catch (Exception e) { e.printStackTrace(); XIAOHUException xiaohuException = new XIAOHUException(e, XIAOHUException.DB_QUERY); subscriber.onError(xiaohuException);}subscriber.onNext(deepSpaceBean);subscriber.onCompleted(); }}); }" 然后接下来的操作符
.flatMap(new Func1<DeepSpaceBean, Observable<DeepSpaceBean>>() {@Overridepublic Observable<DeepSpaceBean> call(DeepSpaceBean deepSpaceBean) { **(关键1)** if (deepSpaceBean == null) {return mDPsRemoteDataSource.getDP(date).doOnNext(new Action1<DeepSpaceBean>() { @Override public void call(DeepSpaceBean deepSpaceBean) {try { mDPsLoaclDataSource.saveDP(deepSpaceBean);} catch (Exception e) { e.printStackTrace();} }}); } else { **(关键2)** return Observable.just(deepSpaceBean); }} });
关键1处,通过判断 发射源 的queryDP的返回值是否为空来区分执行不同的操作,1为空 执行另一个mDPsRemoteDataSource.getDP(date)操作,retrofit的rx式返回
@Overridepublic Observable getDP(String date) { return PDORetrofit.getApiService().getAPOD(date);} @GET('/planetary/apod?api_key=' + API_KEY)Observable<DeepSpaceBean> getAPOD(@Query('date') String date);
然后通过操作符doOnNext执行保存到本地数据库的操作(就是执行sql语句,返回为void,不关心结果)关键处2,如果本地数据库查询(发射源)到了数据 deepSpaceBean != null,于是将它“包装”成observable重新发射出去。
问题解答
回答1:发现可以使用 Concat 这个操作符来替换我那一堆迷之操作
回答2:rxJava这么优雅的类库给你嵌套了这么多的迷之缩也是醉了
回答3:既然能正常运行,说明是合理的。但是代码结构和内部逻辑,你这么写一般人还真看不懂你写的是什么!
相关文章:
1. 什么是前后端分离?用vue angular等js框架就能实现前后分离了吗?2. ddos - apache日志很多其它网址,什么情况?3. android - 百度地图加载完成监听4. 这是什么情况???5. css - chrome浏览器input记录上次cookie信息后,有个黄色背景~如何去除!6. android - 如何实现QQ pad 点击右侧输入框,只顶右侧的布局,左侧布局不动7. vue.js - vue-router开启HTML5的history模式后nginx配置8. javascript - 百度地图自己的产品可以精确定位,为什么我调用他的公开API却必须经过用户同意才能获取精确定位,而且还慢?9. javascript - angular循环的时候取到的值是最后一个值10. html5 - iOS的webview加载出来的H5网页,怎么修改html标签select的样式字体?
