時間:2017年10月16日星期一
說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com
教學源碼:無
學習源碼:https://github.com/zccodere/s...
本門課程的主要內容
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/wiki RxJava中文文檔:https://mcxiaoke.gitbooks.io/rxdocs/content/ RxJava經典資料:https://github.com/lzyzsd/Awesome-RxJava1-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示例
2-3 RxJava擴展觀察者模式四大要素
Observable被觀察者 Observer觀察者 Subscribe訂閱 事件
觀察者模式圖示
RxJava擴展的觀察者模式圖示
第三章:使用詳解 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 super String> 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)
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 創建操作符
* @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 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);
}
});
}
}
3-3 轉換操作
Transforming Observables(轉換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 轉換操作符
* @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 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操作符:一個對象轉換為另一個對象
*/
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)
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操作符:取對應數據項
*/
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 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操作符:取數據項最后一個數據
*/
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 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操作符:在操作后指定時間內無操作時響應
*/
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);
}
});
}
}
3-5 組合操作
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();
}
/**
* 用于將兩個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(處理錯誤)
Catch Retry第四章:線程控制 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庫提供在安卓平臺的調度器(指定觀察者在主線程)
代碼示例
4-3 非阻塞IO操作非阻塞IO操作:圖片保存
阻塞與非阻塞IO操作比較
4-4 指定線程SubscribeOn
RxJava提供了subscribeOn()方法來用于每個Observable對象
ObserveOn
RxJava提供了observeOn()方法來用于每個Subscriber(Observer)對象
網絡請求實例
第五章:課程總結 5-1 課程總結課程總結
理解響應式編程 清楚RxJava和RxAndroid是什么 了解RxJava各種操作符 了解RxJava擴展的觀察者模式與一般觀察者模式的區別 了解RxJava線程調度器(Schedulers)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/67787.html
摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
時間:2018年04月11日星期三 說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com 教學源碼:https://github.com/zccodere/s... 學習源碼:https://github.com/zccodere/s... 第一章:課程介紹 1-1 課程介紹 什么是Netty 高性能、事件驅動、異步非阻塞的IO Java開源框架 基于NIO的客戶...
摘要:數據綁定入門學習總結時間年月日星期日說明本文部分內容均來自慕課網。慕課網教學示例源碼個人學習源碼第一章課程介紹數據綁定入門概述數據綁定概念來自百度百科簡單綁定是將一個用戶界面元素控件的屬性綁定到一個類型對象實例上的某個屬性的方法。 《SpringMVC數據綁定入門》學習總結 時間:2017年2月19日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.co...
閱讀 2544·2021-11-24 09:39
閱讀 4095·2021-11-19 09:40
閱讀 2892·2021-09-27 13:36
閱讀 2055·2019-08-30 15:44
閱讀 638·2019-08-30 13:52
閱讀 2859·2019-08-30 11:13
閱讀 2454·2019-08-29 16:18
閱讀 1916·2019-08-29 15:43