[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 ...
随机推荐
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- java的各种使用小知识点总结。
9,重写Arrays.sort public int getHeight(int[][] actors, int n) { // write code here if (null == actors ...
- erlang 分布式数据库Mnesia 实现及应用
先推荐一篇:mnesia源码分析(yufeng) - linear hash ETS/DETS/mnesia 都使用了linear hash算法 http://en.wikipedia.org ...
- Sublime 3 如何配置SVN插件
在sublime里面安装svn的插件,就可以在sublime的操作界面里面进行相关svn操作,这样就不用再回到文件系统中,进行相关svn的操作. 1.在进入sublime界面后,点击顶部菜单“Pref ...
- LeetCode 162 Find Peak Element
Problem: A peak element is an element that is greater than its neighbors. Given an input array where ...
- Spring学习(三)
1,Spring的事务管理机制 Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的: l PlatformTransactionManager:事务管理器-主要用于 ...
- FOJ 2181 快来买肉松饼
链接:http://acm.fzu.edu.cn/problem.php?pid=2181 思路:乍一看以为是并查集,仔细想了下又找不到让函数结束的条件,所以就看了其他人的搜索大法 #include ...
- 控制window.print不打印某些内容
<style type="text/css" media="print"> .noprint { display:none;} </style ...
- C++ 系列:编译 boost
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- Redis3重建Cluster
1.关闭cluster全部节点2.删除所有nodes.conf文件3.开启全部节点4.依次flushall5.重建集群即可 Share the post "Redis3重建Cluster&q ...