博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
慕课网_《RxJava与RxAndroid基础入门》学习总结
阅读量:6270 次
发布时间:2019-06-22

本文共 21123 字,大约阅读时间需要 70 分钟。

时间:2017年10月16日星期一

说明:本文部分内容均来自慕课网。@慕课网:
教学源码:无
学习源码:

第一章:课程简介

1-1 课程介绍

本门课程的主要内容

RxJava是什么RxAndroid是什么RxJava常用操作符(重点、难点)怎样在项目中使用RxJava和RxAndroid

如何学习RxJava与RxAndroid

总体总体章节,有初步了解跟着讲解自己动手实际去敲代码GitHub上RxJava项目Wiki文档看RxJava相关博客和优秀文章

为什么学RxJava与RxAndroid

RxJava能提高工作效率RxJava能优雅解决复杂业务场景RxJava使用越来越流行RxJava的优秀特性

本门课程能够学到什么

了解什么是响应式编程了解RxJava和RxAndroid到底是什么了解RxJava历史来源清除RxJava与RxAndroid关系学会在项目中使用RxJava和RxAndroid

相关资源

RxJava英文文档:https://github.com/ReactiveX/RxJava/wikiRxJava中文文档:https://mcxiaoke.gitbooks.io/rxdocs/content/RxJava经典资料:https://github.com/lzyzsd/Awesome-RxJava

1-2 响应式编程

什么是响应式编程

定义:是一种基于异步数据流概念的编程模式关键概念:事件使用场景:UI(通用)

第二章:基本概述

2-1 RxJava概述

RxJava是什么

异步数据处理库扩展的观察者模式

RxJava历史来源

Netflix公司遇到问题目标:重构当前架构来减少REST调用的次数尝试:微软RX迁移到JVM

RxJava特点

jar包小于1MB轻量级框架支持Java8 lambda支持Java6及Android 2.3以上支持异步和同步

扩展的观察者模式

onCompleted()事件:通知完毕事件onError()事件:通知异常事件使用组合而不是嵌套,避免陷入回调地狱

2-2 RxAndroid概述

RxAndroid是什么

是RxJava针对Android平台的一个扩展,用于Android开发提供响应式扩展组件快速、易于开发Android应用程序

Schedulers(调度器)

解决Android主线程问题:针对Android解决多线程问题

Schedulers示例

clipboard.png

2-3 RxJava扩展

观察者模式四大要素

Observable被观察者Observer观察者Subscribe订阅事件

观察者模式图示

clipboard.png

RxJava扩展的观察者模式图示

clipboard.png

第三章:使用详解

3-1 入门案例

创建名为myrxjava的maven工程pom如下

4.0.0
com.myimooc
myrxjava
0.0.1-SNAPSHOT
jar
myrxjava
http://maven.apache.org
UTF-8
1.8
1.8
1.8
io.reactivex
rxjava
1.3.2
junit
junit
4.12
test

1.编写HelloWorld类

package com.myimooc.myrxjava;import rx.Observable;import rx.Observable.OnSubscribe;import rx.Subscriber;/** * @title HelloWorld类 * @describe 3-1 入门案例HelloWorld * @author zc * @version 1.0 2017-10-16 */public class HelloWorld {    @SuppressWarnings({ "deprecation", "rawtypes", "unchecked" })    public static void main( String[] args )    {                // 1.创建被观察者        Observable myObservable = Observable.create(new OnSubscribe
(){ @Override public void call(Subscriber
subscriber) { subscriber.onNext("hello World!"); throw new NullPointerException("出错啦"); } }); // 2.创建观察者 Subscriber mySubscriber = new Subscriber
(){ @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext() " + str); } }; // 3.订阅事件 myObservable.subscribe(mySubscriber); }}

3-2 创建操作

操作符的分类

Creating Observables(创建Observable:创建操作)Transforming Observables(转换Observable:转换操作)Filtering Observables(过滤Observable:过滤操作)Combining Observables(组合Observable:组合操作)Error Handling Operators(处理错误)

Creating Observables(创建Observable)

CreateJustFromDeferEmpty/Never/ThrowIntervalRangeRepeatStartTimer

代码编写

1.编写CreatingObservables类

package com.myimooc.myrxjava;import java.util.ArrayList;import java.util.List;import rx.Observable;import rx.Observable.OnSubscribe;import rx.functions.Func0;import rx.Subscriber;/** * @title 创建操作符 * @describe 创建操作符演示 * @author zc * @version 1.0 2017-10-16 */@SuppressWarnings("unused")public class CreatingObservables {        public static void main(String[] args) {//        create();//        just();//        from();//        defer();        repeat();    }        /**     * repeat操作符     */    @SuppressWarnings({ "unchecked", "rawtypes" })    private static void repeat() {        Observable observable= Observable.range(1,5).repeat(2);        observable.subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * range操作符 */ @SuppressWarnings({ "unchecked", "rawtypes" }) private static void range() { Observable observable= Observable.range(1,5); observable.subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } private static String deferStr = "default"; /** * defer操作符 */ @SuppressWarnings({ "unchecked", "rawtypes" }) private static void defer() { Observable observable= Observable.defer(new Func0
>() { @Override public Observable
call() { return Observable.just(deferStr); } }); deferStr = "RxJava"; observable.subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext(): " + str); } }); } /** * from操作符 */ private static void from() { List
nums = new ArrayList
(); nums.add(1); nums.add(2); nums.add(3); nums.add(4); nums.add(5); Observable.from(nums).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * just操作符 */ private static void just() { Observable.just("RxJava").subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext(): " + str); } }); } /** * Create操作符 */ private static void create() { Observable.unsafeCreate(new OnSubscribe
(){ @Override public void call(Subscriber
subscriber) { subscriber.onNext("RxJava"); } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext(): " + str); } }); }}

3-3 转换操作

Transforming Observables(转换Observable)

MapFlatMapGroupByBufferScanWindow

代码编写

1.编写TransformingObservables类

package com.myimooc.myrxjava;import java.util.List;import rx.Observable;import rx.Observer;import rx.Subscriber;import rx.functions.Func1;import rx.functions.Func2;import rx.observables.GroupedObservable;/** * @title 转换操作符 * @describe 转换操作符演示 * @author zc * @version 1.0 2017-10-16 */@SuppressWarnings("unused")public class TransformingObservables {        public static void main(String[] args) {//        transformMap();//        transformFlatMap();//        transformGroupBy();//        transformBuffer();        transformScan();    }    /**     * Scan操作符:对数据进行累加     */    private static void transformScan() {        Observable.range(1,5).scan(new Func2
() { @Override public Integer call(Integer sum, Integer num) { return sum + num; } }).subscribe(new Observer
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Buffer操作符:分批读取数据 */ private static void transformBuffer() { Observable.range(1,5).buffer(2).subscribe(new Observer
>() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(List
str) { System.out.println("onNext(): " + str); } }); } /** * GroupBy操作符:对数据进行分组操作 */ private static void transformGroupBy() { Observable.just(1,2,3,4,5).groupBy(new Func1
(){ @Override public Integer call(Integer data) { return data % 2; } }).subscribe(new Observer
>() { @Override public void onCompleted() { } @Override public void onError(Throwable arg0) { } @Override public void onNext(final GroupedObservable
groupedObservable) { groupedObservable.subscribe(new Subscriber
() { @Override public void onCompleted() { } @Override public void onError(Throwable arg0) { } @Override public void onNext(Integer data) { System.out.println("group:" + groupedObservable.getKey() + " data:" + data); } }); } }); } /** * FlatMap操作符:一个对象转换为多个对象 */ private static void transformFlatMap() { Observable.just(1,2,3,4,5).flatMap(new Func1
>(){ @Override public Observable
call(Integer num) { return Observable.just(String.valueOf(num)); } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext(): " + str); } }); } /** * Map操作符:一个对象转换为另一个对象 */ private static void transformMap() { Observable.just(123).map(new Func1
(){ @Override public String call(Integer num) { return String.valueOf(num); } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(String str) { System.out.println("onNext(): " + str); } }); } }

3-4 过滤操作

Filtering Observables(过滤Observable)

DebounceDistinctElementAtFilterFirstIgnoreElementsLastSampleSkipSkipLastTakeTakeLast

代码编写

1.编写FilteringObservables类

package com.myimooc.myrxjava;import java.util.concurrent.TimeUnit;import rx.Observable;import rx.Observable.OnSubscribe;import rx.Observer;import rx.Subscriber;import rx.functions.Func1;import rx.functions.Func2;/** * @title 过滤操作符 * @describe 过滤操作符演示 * @author zc * @version 1.0 2017-10-17 */@SuppressWarnings("unused")public class FilteringObservables {        public static void main(String[] args) {//        filterDebounce();//        filterDistinct();//        filterElementAt();//        filterFilter();//        filterIgnoreElements();//        filterLast();//        filterSample();//        filterSkip();        filterTake();    }    /**     * Take操作符:取对应数据项     */    private static void filterTake() {        Observable.just(1,2,3,4).takeLast(2).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Skip操作符:跳过数据项 */ private static void filterSkip() { Observable.just(1,2,3,4).skipLast(2).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Sample操作符:取样 */ private static void filterSample() { Observable.unsafeCreate(new OnSubscribe
(){ @Override public void call(Subscriber
arg) { try{ for (int i=0;i<10;i++){ Thread.sleep(1000); arg.onNext(i); } arg.onCompleted(); }catch (Exception e) { arg.onError(e); } } }).sample(4, TimeUnit.SECONDS).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()" + arg0.getMessage()); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Last操作符:取数据项最后一个数据 */ private static void filterLast() { Observable.just(1,2,3,2,3).last().subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * IgnoreElements操作符:忽略掉指定元素,直接回调onCompleted或onError方法 */ private static void filterIgnoreElements() { Observable.unsafeCreate(new OnSubscribe
() { @Override public void call(Subscriber
arg) { arg.onNext(123); arg.onCompleted();// throw new NullPointerException(); } }).ignoreElements().subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()" + arg0.getMessage()); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Filter操作符:过滤 */ private static void filterFilter() { Observable.just(1,2,3,2,3).distinct().filter(new Func1
() { @Override public Boolean call(Integer arg) { return arg > 1; } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * ElementAt操作符:取出指定位置的元素 */ private static void filterElementAt() { Observable.just(1,2,3,2,3).elementAt(3).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Distinct操作符:去重操作符 */ private static void filterDistinct() { Observable.just(1,2,3,2,3).distinct().subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * Debounce操作符:在操作后指定时间内无操作时响应 */ private static void filterDebounce() { Observable.unsafeCreate(new OnSubscribe
(){ @Override public void call(Subscriber
arg) { try{ for (int i=0;i<10;i++){ Thread.sleep(2000); arg.onNext(i); } arg.onCompleted(); }catch (Exception e) { arg.onError(e); } } }).debounce(1,TimeUnit.SECONDS).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } }

3-5 组合操作

Combining Observables(组合Observable)

ZipMergeStartWithCombineLatestJoinSwitchOnNext

代码编写

1.编写CombiningObservables类

package com.myimooc.myrxjava;import rx.Observable;import rx.Subscriber;import rx.functions.Func2;/** * @title 组合操作符 * @describe 组合操作符演示 * @author zc * @version 1.0 2017-10-17 */@SuppressWarnings("unused")public class CombiningObservables {        public static void main(String[] args) {//        combiningZip();//        combiningMerge();//        combiningStartWith();        combiningCombineLatest();    }        /**     * 用于将两个Observable最近传递的数据通过Func2函数的规则进行组合     */    @SuppressWarnings("static-access")    private static void combiningCombineLatest() {        Observable
first = Observable.just(1,3,5); Observable
second = Observable.just(2,4,6); first.combineLatest(first,second,new Func2
(){ @Override public Integer call(Integer num1, Integer num2) { System.out.println("num1 = "+num1 + " num2 = "+num2); return num1 + num2; } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * 用于在源Observable传递的数据前增加数据 * 使用startWith(Iterable
),还可以在源Observable传递的数据前增加Iterable */ private static void combiningStartWith() { Observable
first = Observable.just(1,3,5); Observable
second = Observable.just(2,4,6); first.startWith(second).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * 将两个Observable通知的事件序列合并成一个事件序列,就行是一个Observable通知的一样 * 可以简单的将它理解为两个Observable合并成了一个Observable */ private static void combiningMerge() { Observable
observable1 = Observable.just(1,3,5); Observable
observable2 = Observable.just(2,4,6); Observable.merge(observable1,observable2).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } /** * 用来合并两个Observable传递的数据项,根据Func2函数生成一个新的值并传递出去 * 当其中一个Observable传递数据结束或者出现异常后,另一个Observable也将停止传递数据 */ private static void combiningZip() { Observable
observable1 = Observable.just(10,20,30); Observable
observable2 = Observable.just(4,8,12,16); Observable.zip(observable1,observable2, new Func2
(){ @Override public Integer call(Integer integer1, Integer integer2) { return integer1 + integer2; } }).subscribe(new Subscriber
() { @Override public void onCompleted() { System.out.println("onCompleted()"); } @Override public void onError(Throwable arg0) { System.out.println("onError()"); } @Override public void onNext(Integer str) { System.out.println("onNext(): " + str); } }); } }

3-6 处理错误

Error Handling Operators(处理错误)

CatchRetry

第四章:线程控制

4-1 Java调度器

Schedulers(调度器)

调度器(Schedulers)是RxJava以一种及其简单的方式来解决多线程问题机制

Schedulers(调度器)种类

io()    IO相关的操作    这个调度器用于IO操作computation()    进行计算的操作    这个是计算工作默认的调度器,与IO操作无关    例如:buffer()、debounce()、delay()、interval()、sample()、skip()immediate()    立即执行的操作    这个调度器允许你立即在当前线程执行你指定的工作    例如:timeout()、timeInterval()、timestamp()newThread()    创建一个新的线程    它为指定任务启动一个新的线程trampoline()    按照顺序进行处理    调度器会按序处理队列,并运行队列中每一个任务    例如:repeat()、retry()

4-2 Android调度器

AndroidSchedulers

AndroidSchedulers是RxAndroid库提供在安卓平台的调度器(指定观察者在主线程)

代码示例

clipboard.png

4-3 非阻塞IO操作

非阻塞IO操作:图片保存

clipboard.png

阻塞与非阻塞IO操作比较

clipboard.png

4-4 指定线程

SubscribeOn

RxJava提供了subscribeOn()方法来用于每个Observable对象

ObserveOn

RxJava提供了observeOn()方法来用于每个Subscriber(Observer)对象

网络请求实例

clipboard.png

第五章:课程总结

5-1 课程总结

课程总结

理解响应式编程清楚RxJava和RxAndroid是什么了解RxJava各种操作符了解RxJava扩展的观察者模式与一般观察者模式的区别了解RxJava线程调度器(Schedulers)

转载地址:http://cyvpa.baihongyu.com/

你可能感兴趣的文章
Struts2+JSON数据
查看>>
zTree实现单独选中根节点中第一个节点
查看>>
Cocos2D-x设计模式发掘之中的一个:单例模式
查看>>
很强大的HTML+CSS+JS面试题(附带答案)
查看>>
用树莓派实现RGB LED的颜色控制——C语言版本号
查看>>
VC2012编译CEF3-转
查看>>
java 自己定义异常,记录日志简单说明!留着以后真接复制
查看>>
Android 使用AIDL实现进程间的通信
查看>>
机器学习(Machine Learning)&深度学习(Deep Learning)资料
查看>>
jquery的图片轮播 模板类型
查看>>
C# 获取文件名及扩展名
查看>>
Web安全学习计划
查看>>
输出有序数组的连续序列范围
查看>>
zinnia项目功能分析
查看>>
windows cmd for paramiko
查看>>
SQL经典面试题集锦
查看>>
View学习(一)-DecorView,measureSpec与LayoutParams
查看>>
色彩力量!21款你应该知道的优秀品牌设计
查看>>
SDUT 3503 有两个正整数,求N!的K进制的位数
查看>>
【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径...
查看>>