当子线程处理某个逻辑要在主线程显示的时候使用。

Observable.just(currentBytesCount).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Long>() {@Overridepublic void call(Long aLong) {tvMsg.setText("提示:上传中");progressBar.setMax((int) totalBytesCount);progressBar.setProgress((int) currentBytesCount);}});

清神咒

! 我感觉吧,也许Rx之所以让人感觉恐惧学习成本高,是因为被一些术语绕来绕去绕晕了,术语太抽象,不接近生活本质、很难理解,或者记忆深刻,什么发射,什么观察者、被观察者、什么onNext,但是我一直被这些文章吓得不轻,也被这单词绕来绕去绕晕了,产生了恐惧中,什么观察啊被观察头都晕了,现在我撸了屡,通熟易懂的来说 来本质无非就是 添加一个回调到一个操作类里面,执行这个操作类的时候的时候会遍历调用这些回调, 只是执行的时候可以设置在主线程回调还是子线程回调 以及自己的任务是在主线程执行还是子线程执行
2、没有学以致用,或者不知道什么时候用,应该把什么东西改成什么。

单词介绍和转换概念加深印象

这里不得不说一个事情,就是记忆的技巧,如果你觉得一个东西太过抽象,但是要想不对他产生恐惧,而且想轻松记下来,不会搞混淆搞反,你应该把它变成你熟悉的业务,这样方便你一气呵成,而不是扭啊扭的被术语绕晕。

观察者Observer

1、把它理解操作类
2、把它业务逻辑类
3、强加一个印象,他音乐播放器的具体实现类代码类
4、管理这些回调/处理的逻辑回调的类
5、发布事件的 ,上游

被观察者Observable

1、把它理解为一个回调
2、把它理解为业务逻辑最终执行的你想知道的一个方法活多个监听接口
3、把它理解为一个音乐播放器的进度播放回调、暂停回调。
4、 下游、一般用于主线程
5、接受时间的

订阅 Subscribe

就是把Observer添加到Observable中持有,这样有点饶了,那么换通熟易懂一点。
1、把回调添加到这个控制器的回调接口列表,它会在适当的时机回调它。
2、给就是音乐播放器的控制类设置一个回调、可以设置一个或者多个。
示例

import java.util.Arrays;import io.reactivex.Flowable;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.ObservableOperator;
import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;/*** Created by qssq on 2018/11/14 qssq666@foxmail.com*/public class Main {public static void print(String str) {System.out.println("Main.print:" + str);}public void print_obj(String str) {System.out.println("Main.print_obj:" + str);}public static void main(String[] args) {System.out.println("hllll");
//        testObservableSimple();/*   Observable.fromArray(new byte[]{11111}).flatMap((Func1) (folder) -> {Observable.from(file.listFiles())}).filter((Func1) (file) -> {file.getName().endsWith(".png")}).map((Func1) (file) -> {getBitmapFromFile(file)}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe((Action1) (bitmap) -> {imageCollectorView.addImage(bitmap)});*/
//        testObservable1();/*      Subscriber<Course> subscriber = new Subscriber<Course>() {@Overridepublic void onSubscribe(Subscription s) {}@Overridepublic void onNext(Course course) {}@Overridepublic void onError(Throwable t) {}@Overridepublic void onComplete() {}};*///        testOneObjectMultiChild();
//        testLift();
//        testSmiple();try {Thread.sleep(8000);} catch (Exception e) {}}private static void testLift() {//据说也属于变黄。Observable.just(1, 2, 3, 50, 60)//打印 1 2 3 4,.lift(new ObservableOperator<String, Integer>() { //lift 举起 鼓舞 如果没有使用list,那么 这interger 最后接受的也只能是int,而用这个就实现了变换。  泛型 左边 为 要转换的类型,右边则表示之前的类型 这里必须写成integer,因为之前fajust返回的以及是integer了。@Overridepublic Observer<? super Integer> apply(Observer<? super String> observer) throws Exception {return new Observer<Integer>() {@Overridepublic void onSubscribe(Disposable d) {observer.onSubscribe(d);}@Overridepublic void onNext(Integer integer) {observer.onNext("数字10" + integer + "的16进制为;" + Integer.toHexString(integer));}@Overridepublic void onError(Throwable e) {observer.onError(e);}@Overridepublic void onComplete() {observer.onComplete();}};}}).subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 导致不打印.observeOn(Schedulers.newThread()) // 指定 Subscriber 的回调发生在主线程.subscribe(new Consumer<String>() {@Overridepublic void accept(String o) throws Exception {System.out.println("lift结果:" + o);}});}private static void testOneObjectMultiChild() {//遍历 一对多  所有学生的所学的课程 ,默认是 英语  数学, 张三除外。一对多关系。   map和 flatMap的区别。Student[] students = new Student[]{Student.newInstance("张三").setCourses(new Course[]{Course.newInstance("德语"), Course.newInstance("日语")}), Student.newInstance("李四"), Student.newInstance("王老五"), Student.newInstance("某某")};Observable.fromArray(students).flatMap(new Function<Student, ObservableSource<Course>>() {@Overridepublic ObservableSource<Course> apply(Student student) throws Exception {return Observable.fromArray(student.getCourses());//flatMap是1对多, 而map只能1对1 返回。}}).subscribe(new Consumer<Course>() {@Overridepublic void accept(Course course) throws Exception {System.out.println("课程:" + course.getName());}});}public static class Course {public String getName() {return name;}public Course(String name) {this.name = name;}public Course() {}public void setName(String name) {this.name = name;}public static Course newInstance(String name) {return new Course(name);}String name;}public static class Student {private Course[] courses = new Course[]{Course.newInstance("英语"), Course.newInstance("数学")};public String getName() {return name;}public Student() {}private String name;public Student(String name) {this.name = name;}public static Student newInstance(String name) {return new Student(name);}public static Student newInstance(String name, Course[] courses) {return new Student(name).setCourses(courses);}public Student setCourses(Course[] courses) {this.courses = courses;return this;}public Course[] getCourses() {return courses;}}private static void testSmiple() {Flowable.just("Hello world").subscribe(System.out::println);//表示调用System.out.println来接受字符串 ()Flowable.just("Hello world").subscribe(new Main()::print_obj);//自己定义的方法 非静态Flowable.just("Hello world").subscribe(Main::print);//自己定义的方法,为静态Flowable.just("Hello world").subscribe(new Consumer<String>() {//这种写法等价。@Overridepublic void accept(String s) throws Exception {System.out.println("" + s);}});Flowable.just("Hello world").subscribe(new Consumer<String>() {@Overridepublic void accept(String s) throws Exception {System.out.println("" + s);}});
/*Flowable.fromCallable(new Callable<Object>() {@Overridepublic Object call() throws Exception {return null;}});*///lamba  貌似度一样的执行,模拟背压了??Flowable.fromCallable(() -> {Thread.sleep(5320); //  imitate expensive computation 模拟耗时 昂贵的计算。return "耗时不啊 ,啊啊啊啊啊啊";}).subscribeOn(Schedulers.io()).observeOn(Schedulers.single()).subscribe(System.out::println, Throwable::printStackTrace);//范围打印 也可以实现,学生一对多?Flowable.range(1, 10).parallel()//自动推导 int.runOn(Schedulers.computation()).map(v -> v * v).sequential()//顺序执行.blockingSubscribe(System.out::println);//            Flowable.//遍历数组。String[] names = new String[]{"333", "555", "6666"};Observable.fromArray(names).subscribe(new Consumer<String>() {//消费者,也就是 观察者@Overridepublic void accept(String s) throws Exception {System.out.println(" arr:" + s);}});//有问题,不能指定 订阅线程, 是因为过早退出了Observable.just(1, 2, 3, 4).subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程 导致不打印.observeOn(Schedulers.newThread()) // 指定 Subscriber 的回调发生在主线程.subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) throws Exception {System.out.println("," + integer);}});}private static void testObservableSimple() {Observable.create(new ObservableOnSubscribe<StringBuffer>() {//这里的泛型代表开始发布的泛型。@Overridepublic void subscribe(ObservableEmitter<StringBuffer> emitter) throws Exception {//System.out.println("1、有人订阅了,我要发布," + "," + Thread.currentThread().getName());emitter.onNext(new StringBuffer("很好爱爱"));emitter.onComplete(); // 如果调用了,这个,那么下面的方法都不会继续调用了, 这个应该放到最后面,另外不调用的话也不影响逻辑正常执行,只是不会回调onComplete
//                emitter.onError(new Throwable("测试异常onError"));}}).map(new Function<StringBuffer, StringBuffer>() {@Overridepublic StringBuffer apply(StringBuffer stringBuffer) throws Exception {System.out.println("1.1、AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,收到" + stringBuffer + "," + Thread.currentThread().getName());return new StringBuffer("map---------->");}}).subscribeOn(Schedulers.newThread())//不能插入这个,否则不会走 ,1.2.3.observeOn(Schedulers.newThread())//监听着执行在什么线程.subscribe(new Consumer<StringBuffer>() {@Overridepublic void accept(StringBuffer stringBuffer) throws Exception {System.out.println("2、处理结果:收到字符串:" + stringBuffer + "," + Thread.currentThread().getName());}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {System.err.println("2、处理结果:收到异常:" + throwable + "," + Thread.currentThread().getName());}}, new Action() {@Overridepublic void run() throws Exception {System.out.println("3、收到onCompletion:" + "," + Thread.currentThread().getName());}});}private static void testObservable1() {//执行完毕自动执行 作用是从1-4 不断地发布,总共发布2次,都会走1 ,2 ,3, 4Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> e) throws Exception {System.out.println("subscribe 方法调用,我发布一个时间 onNext 传递 你好 " + e + "," + Thread.currentThread().getName());e.onNext("你好"); //发送事件System.out.println("subscribe 方法调用,我继续发布一个时间 onNext 传递 你好 " + e + "," + Thread.currentThread().getName());e.onNext("你到底好不好"); //发送事件
//                e.onComplete();//某些文章说要调用,感觉没作用
//                e.onComplete();
//                e.onComplete();System.out.println("subscribe 任务下发完毕");}}).map(new Function<String, byte[]>() { // 左边为接受的参数,右边为返回值@Overridepublic byte[] apply(String str) throws Exception {System.out.println("1、apply 收到字符串" + str + ",我返回结果数组:  " + str + "," + Thread.currentThread().getName());return new byte[]{};}}).map(new Function<byte[], String>() { // 输入字节码数组,保存文件,输出文件路径@Overridepublic String apply(byte[] byteArray) throws Exception {System.out.println("2、apply arr 收到刚刚传递的数组 " + Arrays.toString(byteArray) + "我再次返回字符串: 哈哈哈 " + Thread.currentThread().getName());return "哈哈哈哈";}}).map(new Function<String, Integer>() { //输入class路径,jar uvf命令替换jar@Overridepublic Integer apply(String s) throws Exception {System.out.println("3、apply  收到字符串" + s + "iinteger 我返回结果标记为1 " + Thread.currentThread().getName());/* if (s != "a") {throw new RuntimeException("走 错误标记吧少年..");}*/return 1;}}).map(new Function<Integer, Float>() {@Overridepublic Float apply(Integer integer) {System.out.println("3.1、apply  收到int " + integer + " iinteger 我返回结果标记为 5 " + Thread.currentThread().getName());return 5.0f;//如果这里第二个泛型 为float,那么 订阅 也应该是泛型。}}).subscribe(new Consumer<Float>() {//这里是订阅,订阅有一个成功和失败的回调。链式编程看习惯了就好了 e subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError)@Overridepublic void accept(Float status) throws Exception {//表示一个onNext onMap 等执行完毕但是System.out.println("4、result:accept  收到int值:" + status + "," + Thread.currentThread().getName());}}, new Consumer<Throwable>() {//表示的是上下发布了错误或者 抛出了错误。@Overridepublic void accept(Throwable throwable) throws Exception {System.err.println("4、accept error:" + throwable.toString() + " ," + Thread.currentThread().getName());}});}}

http://www.taodudu.cc/news/show-4179734.html

相关文章:

  • 【css 基础】
  • CSS常用标签·定位
  • 你不可不知的《哈利波特》秘密(二)
  • 般若波罗蜜多心经——背过最好了
  • 《倾城·魅影——CG奇幻插画及技法赏析》—神咒
  • 创新的10个角色
  • 元宇宙创新解读
  • 四个小故事—体验经济:互联网生存的秘密
  • 一个产品人和“阿里云”的故事
  • 无处不在的微创新——验证码的故事
  • 几个创业小故事的启示
  • 创新之道,亚马逊创新之旅背后的故事
  • 快排模板C语言
  • C语言,往排好序的数组中插入元素
  • 单词倒排(C语言)
  • C语言编程——随机排座位+指定座位
  • 快排 C语言实现
  • C语言中快排函数——qsort()
  • C语言排座位s型
  • 快排C语言三种实现方法(大同小异)
  • 为什么c语言排在第一位,c语言我排第几个
  • C语言万年历(n排)
  • 倒排索引c语言,Inverted Index(倒排索引)
  • C语言:快排详解
  • C语言实现快排算法
  • 【C】排大小
  • c实现快排
  • c语言排快速排序过程,C语言中快速排序法怎么排
  • 快排C语言的实现
  • C语言实现稳定的快排

RxJavaAndroid学习笔记相关推荐

  1. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  2. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  3. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  4. 2020年Yann Lecun深度学习笔记(下)

    2020年Yann Lecun深度学习笔记(下)

  5. 2020年Yann Lecun深度学习笔记(上)

    2020年Yann Lecun深度学习笔记(上)

  6. 知识图谱学习笔记(1)

    知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...

  7. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  8. Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)

    Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...

  9. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

最新文章

  1. 大三Java后端暑期实习面经总结——Java容器篇
  2. eclipse开发cocos2dx 3.2环境搭建之一: Android C\C++环境搭建(ndk r9d)
  3. prefuse学习(二)显示一张图
  4. Redis基本使用及百亿数据量中的使用技巧分享
  5. 点击调试时提示MFC不包含调试信息
  6. [转]C++编译链接过程详解
  7. vs2015开发在网页中调用的ocx控件详解(一)
  8. 入门云计算要学习掌握哪些技术?
  9. 《天涯明月刀》服务器端3D引擎设计与开发
  10. 通过图书编号查询python_基于Python的图书ISBN查询接口调用代码实例
  11. Unity里加速纹理压缩
  12. CNVD国家区块链漏洞库漏洞通报
  13. 算法—— LeetCode 第一遍
  14. 小码哥C++_面向对象
  15. 【英语:发音基础】A1.元音与辅音
  16. 阿里阿里,搞不定政企
  17. 基于51单片机的计步器步数检测无线蓝牙APP上传方案原理图设计
  18. Python+Pycharm和 VisualStudio C++社区版使用PK及易混淆的语法问题
  19. 福克斯车钥匙遥控失灵解决办法
  20. 在Fedora 12上安装RealPlayer 11

热门文章

  1. ROS文件系统和文件系统操作
  2. 中医针灸学综合练习题库【7】
  3. Uedit32高亮文件(加强)
  4. 行列式(Determinants)
  5. 荧光微球激发光谱图/橙色荧光微球/绿色荧光微球/氨基红色荧光微球/氨基橙色荧光微球
  6. 组合投资的风险与收益概述
  7. 【文献笔记】【精读】Near-Ultrasound Communication for TV’s 2nd Screen Services
  8. 常用路由协议的分析及比较/RIP/IGRP/OSPF/BGP
  9. HTML5 页面制作工具
  10. download failed: assets/main/import/09/09f53264-cd95-4751-99ad-d516c164dd80._cconb.dbbin, status: 40