時(shí)間:2017年10月16日星期一
說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com
教學(xué)源碼:無
學(xué)習(xí)源碼:https://github.com/zccodere/s...
本門課程的主要內(nèi)容
RxJava是什么 RxAndroid是什么 RxJava常用操作符(重點(diǎn)、難點(diǎn)) 怎樣在項(xiàng)目中使用RxJava和RxAndroid
如何學(xué)習(xí)RxJava與RxAndroid
總體總體章節(jié),有初步了解 跟著講解自己動(dòng)手實(shí)際去敲代碼 GitHub上RxJava項(xiàng)目Wiki文檔 看RxJava相關(guān)博客和優(yōu)秀文章
為什么學(xué)RxJava與RxAndroid
RxJava能提高工作效率 RxJava能優(yōu)雅解決復(fù)雜業(yè)務(wù)場(chǎng)景 RxJava使用越來越流行 RxJava的優(yōu)秀特性
本門課程能夠?qū)W到什么
了解什么是響應(yīng)式編程 了解RxJava和RxAndroid到底是什么 了解RxJava歷史來源 清除RxJava與RxAndroid關(guān)系 學(xué)會(huì)在項(xiàng)目中使用RxJava和RxAndroid
相關(guān)資源
RxJava英文文檔:https://github.com/ReactiveX/RxJava/wiki RxJava中文文檔:https://mcxiaoke.gitbooks.io/rxdocs/content/ RxJava經(jīng)典資料:https://github.com/lzyzsd/Awesome-RxJava1-2 響應(yīng)式編程
什么是響應(yīng)式編程
定義:是一種基于異步數(shù)據(jù)流概念的編程模式 關(guān)鍵概念:事件 使用場(chǎng)景:UI(通用)第二章:基本概述 2-1 RxJava概述
RxJava是什么
異步數(shù)據(jù)處理庫 擴(kuò)展的觀察者模式
RxJava歷史來源
Netflix公司遇到問題 目標(biāo):重構(gòu)當(dāng)前架構(gòu)來減少REST調(diào)用的次數(shù) 嘗試:微軟RX遷移到JVM
RxJava特點(diǎn)
jar包小于1MB 輕量級(jí)框架 支持Java8 lambda 支持Java6及Android 2.3以上 支持異步和同步
擴(kuò)展的觀察者模式
onCompleted()事件:通知完畢事件 onError()事件:通知異常事件 使用組合而不是嵌套,避免陷入回調(diào)地獄2-2 RxAndroid概述
RxAndroid是什么
是RxJava針對(duì)Android平臺(tái)的一個(gè)擴(kuò)展,用于Android開發(fā) 提供響應(yīng)式擴(kuò)展組件快速、易于開發(fā)Android應(yīng)用程序
Schedulers(調(diào)度器)
解決Android主線程問題:針對(duì)Android 解決多線程問題
Schedulers示例
2-3 RxJava擴(kuò)展觀察者模式四大要素
Observable被觀察者 Observer觀察者 Subscribe訂閱 事件
觀察者模式圖示
RxJava擴(kuò)展的觀察者模式圖示
第三章:使用詳解 3-1 入門案例創(chuàng)建名為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.創(chuàng)建被觀察者 Observable myObservable = Observable.create(new OnSubscribe3-2 創(chuàng)建操作(){ @Override public void call(Subscriber super String> subscriber) { subscriber.onNext("hello World!"); throw new NullPointerException("出錯(cuò)啦"); } }); // 2.創(chuàng)建觀察者 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); } }
操作符的分類
Creating Observables(創(chuàng)建Observable:創(chuàng)建操作) Transforming Observables(轉(zhuǎn)換Observable:轉(zhuǎn)換操作) Filtering Observables(過濾Observable:過濾操作) Combining Observables(組合Observable:組合操作) Error Handling Operators(處理錯(cuò)誤)
Creating Observables(創(chuàng)建Observable)
Create Just From Defer Empty/Never/Throw Interval Range Repeat Start Timer
代碼編寫
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 創(chuàng)建操作符 * @describe 創(chuàng)建操作符演示 * @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 Subscriber3-3 轉(zhuǎn)換操作() { @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 super String> 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); } }); } }
Transforming Observables(轉(zhuǎn)換Observable)
Map FlatMap GroupBy Buffer Scan Window
代碼編寫
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 轉(zhuǎn)換操作符 * @describe 轉(zhuǎn)換操作符演示 * @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操作符:對(duì)數(shù)據(jù)進(jìn)行累加 */ private static void transformScan() { Observable.range(1,5).scan(new Func23-4 過濾操作() { @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操作符:分批讀取數(shù)據(jù) */ 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操作符:對(duì)數(shù)據(jù)進(jìn)行分組操作 */ 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操作符:一個(gè)對(duì)象轉(zhuǎn)換為多個(gè)對(duì)象 */ private static void transformFlatMap() { Observable.just(1,2,3,4,5).flatMap(new Func1 >(){ @Override public Observable extends String> 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操作符:一個(gè)對(duì)象轉(zhuǎn)換為另一個(gè)對(duì)象 */ 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); } }); } }
Filtering Observables(過濾Observable)
Debounce Distinct ElementAt Filter First IgnoreElements Last Sample Skip SkipLast Take TakeLast
代碼編寫
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操作符:取對(duì)應(yīng)數(shù)據(jù)項(xiàng) */ private static void filterTake() { Observable.just(1,2,3,4).takeLast(2).subscribe(new Subscriber3-5 組合操作() { @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操作符:跳過數(shù)據(jù)項(xiàng) */ 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 super Integer> 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操作符:取數(shù)據(jù)項(xiàng)最后一個(gè)數(shù)據(jù) */ 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操作符:忽略掉指定元素,直接回調(diào)onCompleted或onError方法 */ private static void filterIgnoreElements() { Observable.unsafeCreate(new OnSubscribe () { @Override public void call(Subscriber super Integer> 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操作符:在操作后指定時(shí)間內(nèi)無操作時(shí)響應(yīng) */ private static void filterDebounce() { Observable.unsafeCreate(new OnSubscribe (){ @Override public void call(Subscriber super Integer> 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); } }); } }
Combining Observables(組合Observable)
Zip Merge StartWith CombineLatest Join SwitchOnNext
代碼編寫
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(); } /** * 用于將兩個(gè)Observable最近傳遞的數(shù)據(jù)通過Func2函數(shù)的規(guī)則進(jìn)行組合 */ @SuppressWarnings("static-access") private static void combiningCombineLatest() { Observable3-6 處理錯(cuò)誤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傳遞的數(shù)據(jù)前增加數(shù)據(jù) * 使用startWith(Iterable ),還可以在源Observable傳遞的數(shù)據(jù)前增加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); } }); } /** * 將兩個(gè)Observable通知的事件序列合并成一個(gè)事件序列,就行是一個(gè)Observable通知的一樣 * 可以簡(jiǎn)單的將它理解為兩個(gè)Observable合并成了一個(gè)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); } }); } /** * 用來合并兩個(gè)Observable傳遞的數(shù)據(jù)項(xiàng),根據(jù)Func2函數(shù)生成一個(gè)新的值并傳遞出去 * 當(dāng)其中一個(gè)Observable傳遞數(shù)據(jù)結(jié)束或者出現(xiàn)異常后,另一個(gè)Observable也將停止傳遞數(shù)據(jù) */ 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); } }); } }
Error Handling Operators(處理錯(cuò)誤)
Catch Retry第四章:線程控制 4-1 Java調(diào)度器
Schedulers(調(diào)度器)
調(diào)度器(Schedulers)是RxJava以一種及其簡(jiǎn)單的方式來解決多線程問題機(jī)制
Schedulers(調(diào)度器)種類
io() IO相關(guān)的操作 這個(gè)調(diào)度器用于IO操作 computation() 進(jìn)行計(jì)算的操作 這個(gè)是計(jì)算工作默認(rèn)的調(diào)度器,與IO操作無關(guān) 例如:buffer()、debounce()、delay()、interval()、sample()、skip() immediate() 立即執(zhí)行的操作 這個(gè)調(diào)度器允許你立即在當(dāng)前線程執(zhí)行你指定的工作 例如:timeout()、timeInterval()、timestamp() newThread() 創(chuàng)建一個(gè)新的線程 它為指定任務(wù)啟動(dòng)一個(gè)新的線程 trampoline() 按照順序進(jìn)行處理 調(diào)度器會(huì)按序處理隊(duì)列,并運(yùn)行隊(duì)列中每一個(gè)任務(wù) 例如:repeat()、retry()4-2 Android調(diào)度器
AndroidSchedulers
AndroidSchedulers是RxAndroid庫提供在安卓平臺(tái)的調(diào)度器(指定觀察者在主線程)
代碼示例
4-3 非阻塞IO操作非阻塞IO操作:圖片保存
阻塞與非阻塞IO操作比較
4-4 指定線程SubscribeOn
RxJava提供了subscribeOn()方法來用于每個(gè)Observable對(duì)象
ObserveOn
RxJava提供了observeOn()方法來用于每個(gè)Subscriber(Observer)對(duì)象
網(wǎng)絡(luò)請(qǐng)求實(shí)例
第五章:課程總結(jié) 5-1 課程總結(jié)課程總結(jié)
理解響應(yīng)式編程 清楚RxJava和RxAndroid是什么 了解RxJava各種操作符 了解RxJava擴(kuò)展的觀察者模式與一般觀察者模式的區(qū)別 了解RxJava線程調(diào)度器(Schedulers)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67787.html
摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說明本文部分內(nèi)容均來自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...
時(shí)間:2018年04月11日星期三 說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com 教學(xué)源碼:https://github.com/zccodere/s... 學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅(qū)動(dòng)、異步非阻塞的IO Java開源框架 基于NIO的客戶...
摘要:數(shù)據(jù)綁定入門學(xué)習(xí)總結(jié)時(shí)間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼個(gè)人學(xué)習(xí)源碼第一章課程介紹數(shù)據(jù)綁定入門概述數(shù)據(jù)綁定概念來自百度百科簡(jiǎn)單綁定是將一個(gè)用戶界面元素控件的屬性綁定到一個(gè)類型對(duì)象實(shí)例上的某個(gè)屬性的方法。 《SpringMVC數(shù)據(jù)綁定入門》學(xué)習(xí)總結(jié) 時(shí)間:2017年2月19日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.co...
閱讀 2349·2021-11-24 09:39
閱讀 3793·2021-11-19 09:40
閱讀 2166·2021-09-27 13:36
閱讀 1906·2019-08-30 15:44
閱讀 404·2019-08-30 13:52
閱讀 2720·2019-08-30 11:13
閱讀 2202·2019-08-29 16:18
閱讀 1768·2019-08-29 15:43