[RxJava]在学习RxJava中的错误理解
关于RxJava语法的问题与理解
最近看到一个blog-RxJava 写到关于Observable数据异步加载的介绍。针对fromCallable和just操作符在使用上的问题来跟大家针对代码进行分析一下:
代码思想
/**
* 数据获取
**/
String getMessage() {
Log.d("RxJava", Thread.currentThread().getName());
return "getMessage";
}
/**
* 订阅
**/
Subscriber<Object> getSubscriber() {
return new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.d("RxJava", "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d("RxJava", "onError : " + e.toString());
}
@Override
public void onNext(Object o) {
Log.d("RxJava", "onNext : " + o);
Log.d("RxJava", Thread.currentThread().getName());
}
};
}
使用fromCallable操作符
public void run() {
Observable<String> o = Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return getMessage();
}
});
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
使用just操作符
public void run() {
Observable<String> o = Observable.just(getMessage());
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
执行结果上,使用fromCallable时,getMessage是在子线程执行,而just是在主线程执行。
原作者给出的结论是
使用Observable.fromCallable()方法有两点好处:
1.获取要发送的数据的代码只会在有Observer订阅之后执行。
2.获取数据的代码可以在子线程中执行。
我觉得这样的结论是有问题,我来修改一个代码,来分析一下:
Observable<String> getObservable(final String s) {
return Observable.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return s;
}
});
}
public void run() {
Observable<String> o = Observable.getObservable(getMessage());
o.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(getSubscriber());
}
执行结果发现,getMessage是在主线程执行。
为什么是这样呢?其实这就是Java语言的调用顺序的问题而不是操作符的功能。希望大家学习Rxjava的过程中,不要脱离原有的Java语言结构,毕竟Rajva的源码也是Java语言写出来的。
[RxJava]在学习RxJava中的错误理解的更多相关文章
- 学习PDO中的错误与错误处理模式
在 PDO 的学习过程中,我们经常会在使用事务的时候加上 try...catch 来进行事务的回滚操作,但是大家有没有注意到默认情况下 PDO 是如何处理错误语句导致的数据库操作失败问题呢?今天,我们 ...
- 记一次学习PHP中的错误
今天学习PHP时,回想起一段代码 <?php> $i = true; $o = true; $p = false; if($i or $o and $p){ echo '输出为'.'tru ...
- RxJava的学习与实现
RxJava 要在Android中使用RxJava2, 先添加Gradle配置: compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.rea ...
- 如何理解并学习javascript中的面向对象(OOP) [转]
如果你想让你的javascript代码变得更加优美,性能更加卓越.或者,你想像jQuery的作者一样,写出属于自己优秀的类库(哪怕是基于 jquery的插件).那么,你请务必要学习javascript ...
- Python学习-16.Python中的错误处理
虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: file = open('','r') 上面一句 ...
- linux中socket的理解
对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...
- Android学习开发中如何保持API的兼容
Android学习开发中如何保持API的兼容: 1,采用良好的设计思路 在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久 面向用例的设计,收集用户建议,把自己模拟成用户,保证AP ...
- ArcGIS 编程中对接口的理解
学习AO,最重要的是理解“接口”这个概念.接口是什么?有什么具体作用?在多种计算机高级语言中,都可以看到“接口”这个术语,但基本上每一本书对“为什么使用接口”等重要文都都“语焉不详”,使得初学者往往不 ...
- python编程中常见错误
python编程培训中常见错误最后,我想谈谈使用更多python函数(数据类型.函数.模块.类等)时可能遇到的问题.由于篇幅有限,我们试图将其简化,特别是一些高级概念.有关更多详细信息,请阅读学习py ...
随机推荐
- DuBrute 3.1
PS:转载自小残博客. 今天发现时隔很久的DuBrute竟然更新了,为此我在分享给大家,软件我没测试效果,使用过的朋友或许很清楚,不会太差! 曾几何时,小残也在用DUbrute爆破工具,且玩的不亦乐乎 ...
- python 模块包裹
arlenmbx@arlenmbx-ThinkPad-X130e:~$ su root 密码: root@arlenmbx-ThinkPad-X130e:/home/arlenmbx# python ...
- kali 安装ss代理客户端的方法(纯属个人总结)
1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...
- npm提速
解决办法:npm --> cnpm https://npm.taobao.org
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- 搭建java环境(Eclipse为例)
工作快一年了,回过来看基础java,颇有感触. 1.JDK下载(Oracle官网下载) 2.JDK安装(切记安装路径) 3.win7中环境变量设置 (1)在环境变量中,新建"系统变量&quo ...
- django一些操作命令
1.数据库与class类同步命令 syncdb command is deprecated in django 1.7. Use the python manage.py migrate instea ...
- mvc学习中的问题汇总
问题1:更新条目时出错.有关详细信息,请参阅内部异常. 初学MVC,正好手上有别人搭建的一个框架.于是直接用了起来.一切似乎都很顺利. 列表页也正常读取了.可是在新增数据时,始终报如上的错.即使用了调 ...
- android studio使用部分报错处理
1.android studio 导入项目时Error:SSL peer shut down incorrectly 今天导入一个项目到studio,显示在下载一个一个1.1.0-rc4的东西. 过了 ...
- 【React】组件生命周期
初始化阶段 getDefaultPropos:只调用一次,实力之间共享引用 getInitialState:初始化每个实例特有的状态 componentWillMount:render之前最后一次修改 ...