RxJava2.0_1:基础学习和理解

参考:

http://blog.csdn.net/lzyzsd/article/details/41833541

http://blog.csdn.net/u012702547/article/details/52175520

http://www.jianshu.com/p/98da2c2e3576

引入rxJava所能解决的事情

1、通过链式调用让流程结构更叫清晰。
2、解决回调嵌套问题

eg:1、查询数据库
2、网络请求
3、点击相应等

这些具有先后逻辑顺序的异步事情都可以通过Rxjava来解决。

基础

RxJava最核心的两个东西是Observable(被观察者,事件源)和Subscriber(观察者)。Observable发出一系列事件,Subscriber处理这些事件。而对于Observerables来说我们可以无限地去对他的数据进行相应的处理。

一个Observable可以发出零个或者多个事件,知道结束或者出错。每发出一个事件,就会调用它的Subscriber的onNext方法,最后调用Subscriber.onNext()或者Subscriber.onError()结束。

Rxjava的看起来很想设计模式中的观察者模式,但是有一点明显不同,那就是如果一个Observerble没有任何的的Subscriber,那么这个Observable是不会触发出任何事件的。

简单的流程:

RxJava它是一个异步库,这个异步库可以让我们用非常简洁的代码来处理复杂数据流或者事件。Observable用户发送消息,而Observer用于消费消息,在实际开发中,我们更多的是选择Observer的一个子类Subscriber来消费消息。在消息发送的过程中,Observable可以发送任意数量任意类型的消息(甚至一个将一个触摸事件当作一个消息发出),当Observable所发送的消息被成功处理或者消息出错时,一个流程结束。Observable会用它的每一个Subscriber(观察者)的onNext方法进行消息处理,在消息成功处理后以onComplete()方法结束流程,如果消息在处理的过程中出现了任何异常,则以onError()方法结束流程。

Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("哈哈哈哈");
                subscriber.onNext("lalalala");
                subscriber.onCompleted();
            }
        })
                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {
                        Log.d("google_lenve_fb", "onCompleted: onCompleted()");
                    }  

                    @Override
                    public void onError(Throwable e) {
                        Log.d("google_lenve_fb", "onError:onError() ");
                    }  

                    @Override
                    public void onNext(String s) {
                        Log.d("google_lenve_fb", "onNext: " + s);
                    }
                }); 

对象简介

Observable (可观察者,即被观察者)、Observer (观察者)、subscribe (订阅)、事件。Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer。

Observable (可观察者,即被观察者):

它决定什么时候触发事件以及触发怎样的事件。

Observer和subscriber (观察者):

public abstract class Subscriber<T> implements Observer<T>, Subscription 
public interface Observer<T>{   public void onNext(T t);
   public void onCompleted();
   public void onError(Throwable e);
}

observer和subscriber很多时候都差不多,他们的主要区别有两个:

  1. onStart():用于做一些准备工作,例如数据的清零或重置。它总是在 subscribe 所发生的线程被调用,而不能指定线程。

  2. unsubscribe(): 用于取消订阅,subscribe() 之后, Observable 会持有 Subscriber 的引用,这个引用如果不能及时被释放,将有内存泄露的风险。所以最好保持一个原则:要在不再使用的时候尽快在合适的地方(例如 onPause() onStop() 等方法中)调用 unsubscribe() 来解除引用关系,以避免内存泄露的发生。

subscribe (订阅):

创建了 Observable 和 Observer 之后,再用 subscribe() 方法将它们联结起来,整条链子就可以工作了。

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);

整体关系:

常用操作符

from函数

Observale中的from函数接受一个数组,这个方法返回一个按数组元素的顺序来发射这些数据的Observale。

Observable.from(new String[]{"竹外桃花三两枝", "春江水暖鸭先知"})
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {  

                    }  

                    @Override
                    public void onError(Throwable e) {  

                    }  

                    @Override
                    public void onNext(String s) {
                        Log.d("google_lenve_fb", "onNext: " + s);
                    }
                });  

印的结果:

D/google_lenve_fb: onNext: 竹外桃花三两枝
D/google_lenve_fb: onNext: 春江水暖鸭先知 

just函数

接受最多10个参数,返回一个按参数顺序发射这些数据的Observable。

Observable.just("Hello", "World", "Hello", "RxJava!","塞外秋来风景异","衡阳雁去无留意"
        ,"四面边声连角起","千嶂里","长烟落日孤城闭","浊酒一杯家万里")
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {  

                    }  

                    @Override
                    public void onError(Throwable e) {  

                    }  

                    @Override
                    public void onNext(String s) {
                        Log.d("google_lenve_fb", "onNext: " + s);
                    }
                }); 

打印结果:

D/google_lenve_fb: onNext: Hello
D/google_lenve_fb: onNext: World
D/google_lenve_fb: onNext: Hello
D/google_lenve_fb: onNext: RxJava!
D/google_lenve_fb: onNext: 塞外秋来风景异
D/google_lenve_fb: onNext: 衡阳雁去无留意
D/google_lenve_fb: onNext: 四面边声连角起
D/google_lenve_fb: onNext: 千嶂里
D/google_lenve_fb: onNext: 长烟落日孤城闭
D/google_lenve_fb: onNext: 浊酒一杯家万里  

map函数

对Observable创建的原始数据进行二次加工,然后再被观察者获取。

Observable.from(new String[]{"醉里挑灯看剑","梦回吹角连营"})
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return s + "---辛弃疾";
                    }
                })
                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {  

                    }  

                    @Override
                    public void onError(Throwable e) {  

                    }  

                    @Override
                    public void onNext(String s) {
                        Log.d("google_lenve_fb", "onNext: " + s);
                    }
                });

打印结果

D/google_lenve_fb: onNext: 醉里挑灯看剑---辛弃疾
D/google_lenve_fb: onNext: 梦回吹角连营---辛弃疾

flatMap函数

接受一个Observable函数作为输入函数,然后在这个输入的基础上再创建一个新的Observable进行输出。

Observable.just("落霞与孤鹜齐飞", "秋水共长天一色")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return Observable.from(new  String[]{s + "冯唐易老", s + "李广难封"});
                    }
                }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {  

            }  

            @Override
            public void onError(Throwable e) {  

            }  

            @Override
            public void onNext(String s) {
                Log.d("google_lenve_fb", "onNext: " + s);
            }
        });

打印结果:

D/google_lenve_fb: onNext: 落霞与孤鹜齐飞冯唐易老
D/google_lenve_fb: onNext: 落霞与孤鹜齐飞李广难封
D/google_lenve_fb: onNext: 秋水共长天一色冯唐易老
D/google_lenve_fb: onNext: 秋水共长天一色李广难封

subscribeOn函数和observeOn函数

  • subscribeOn()主要改变的是订阅的线程,即call()执行的线程;

  • observeOn()主要改变的是发送的线程,即onNext()执行的线程。

线程:

AndroidSchedulers.mainThread():主线程

Schedulers.io():处理IO的线程

Schedulers.newThread():新创建的线程.

Schedulers.computation():计算的线程

RxJava2.0_1:基础学习和理解相关推荐

  1. FPGA零基础学习资料

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  2. FPGA零基础学习:在FPGA中,同步信号、异步信号和亚稳态的理解

    FPGA零基础学习:在FPGA中,同步信号.异步信号和亚稳态的理解 叁芯智能科技-郝旭帅团队打造"FPGA 设计与研发"学习系列, 可以让设计者从"小白"到&q ...

  3. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  4. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

    原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...

  5. Java零基础学习难吗

    java编程是入行互联网的小伙伴们大多数的选择,那么对于零基础的小伙伴来说Java零基础学习难吗?如果你是初学者,你可以很好的理解java编程语言.并不困难.如果你的学习能力比较高,那么你对Java的 ...

  6. 零基础学习java,这些书一定要看!

    学习java技术除了看视频,看书也是非常重要的,尤其是零基础同学,本文包含学习Java各个阶段的书籍推荐,史上最全,学习Java,没有书籍怎么行,就好比出征没带兵器一个道理,这些书籍整理出来给大家作为 ...

  7. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  8. 鸟哥的linux 实训教程,鸟哥的Linux基础学习实训教程

    1.理想的Linux上机实践课程 每周一次.每次三小时的学与练 本书所有例题讲解,均经过鸟哥在大专院校实施多年来的测试,对于学生的理解具有相当满意的效果. 2. 提供一致性教学环境 让学习者不再有陌生 ...

  9. 计算机基础与应用(上)笔记总结,计算机基础学习心得体会范文(通用3篇)

    计算机基础学习心得体会范文(通用3篇) 当我们对人生或者事物有了新的思考时,好好地写一份心得体会,这样可以记录我们的思想活动.那么要如何写呢?以下是小编精心整理的计算机基础学习心得体会范文(通用3篇) ...

  10. 大数据入门之Hadoop基础学习

    前言 目前人工智能和大数据火热,使用的场景也越来越广,日常开发中前端同学也逐渐接触了更多与大数据相关的开发需求.因此对大数据知识也有必要进行一些学习理解 基础概念 大数据的本质 一.数据的存储:分布式 ...

最新文章

  1. Forefront基本知识介绍
  2. java窗口代码_Java系列教程day01——java的搭建环境
  3. ITK:二维高斯混合模型期望最大化
  4. Hadoop之Hadoop企业优化(HDFS小文件优化)
  5. 【渝粤题库】国家开放大学2021春2476旅游学概论题目
  6. android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)
  7. mysql开启yum search pt-mysql_Centos使用MySQL工具Percona Toolkit
  8. Spring Boot笔记-WebSocket的使用
  9. checkbox 选中_纯CSS修改checkbox复选框样式
  10. linux db2表空间目录,db2 表空间的一些知识
  11. mysql 部署到服务器_服务器快速部署--使用Docker部署MySQL
  12. Linux修改后保存与不保存,强制退出vi与vi下查找命令关键步骤!
  13. 悲剧!他写了20000行代码,却连6岁孩子都比不过!
  14. SLIC超像素分割详解(一)(二)(三)
  15. 两行代码开启 Ubuntu ftp服务
  16. linux系统镜像下载
  17. MATLAB获取附加功能的方法
  18. ENVI学习总结——基于改进的 CASA 模型反演NPP
  19. ssim 算法 java实现_图像质量评价指标之 PSNR 和 SSIM
  20. 简单的有监督学习实例——简单线性回归

热门文章

  1. 关于《损失模型》的一点笔记——第一部分引言
  2. R语言使用lm函数构建多元回归模型、并根据模型系数写出回归方程、使用summary函数计算出模型的汇总统计信息(R方、F统计量、残差分布、残差标准误差、系数等)
  3. remix下ballot.sol调试
  4. Elasticsearch:Dissect 和 Grok 处理器之间的区别
  5. 虚拟服务器zend optimizer,windows服务器配置Zend Optimizer方法-安装Zend Optimizer步骤-SEO优化-猴子技术宅...
  6. 苹果的教育优惠怎么弄_京东苹果自营如何使用教育优惠!
  7. Treap(二)——#10144. 「一本通 4.6 练习 1」宠物收养所
  8. WEP(有线等效保密)
  9. 云原生的进一步具象化
  10. 【TensorFlow】使用slim从ckpt里导出指定层的参数