国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

RxJava 入門(三)-- 操作符簡(jiǎn)介

2019-11-06 09:34:38
字體:
供稿:網(wǎng)友

在 Rxjava 中,如果把整個(gè) 事件流看成 是工廠的流水線,Observable 就是原料,Observer 就是我們的產(chǎn)品經(jīng)理。產(chǎn)品如何交到我們的產(chǎn)品經(jīng)理手上?其中重要的就是操作工人(Operator 操作符),它負(fù)責(zé)在 Observable 發(fā)出的事件 和 Observer 的響應(yīng)之間做一些處理。

操作符分類

Creating ObservablesTransforming ObservablesFiltering ObservablesCombining Observables(合并)Error Handling OperatorsObservable Utility Operators(輔助類)Conditional and Boolean OperatorsMathematical and Aggregate Operators(算數(shù))Connectable Observable Operators(背壓)Operators to Convert Observables(連接)自定義操作符

1. Observable的創(chuàng)建 – 創(chuàng)建性操作符

1.1 使用create( ),最基本的創(chuàng)建方式:

Observable<String> observable = Observable.create(new OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("create1"); // 發(fā)射一個(gè)"create1"的String subscriber.onNext("create2"); // 發(fā)射一個(gè)"create2"的String subscriber.onCompleted(); // 發(fā)射完成,這種方法需要手動(dòng)調(diào)用onCompleted,才會(huì)回調(diào)Observer的onCompleted方法 } });

1.2 使用just( ),將為你創(chuàng)建一個(gè)Observable并自動(dòng)為你調(diào)用onNext( )發(fā)射數(shù)據(jù):

justObservable = Observable.just("just1","just2");//依次發(fā)送"just1"和"just2"

1.3 使用from( ),遍歷集合,發(fā)送每個(gè)item

List<String> list = new ArrayList<>();list.add("from1");list.add("from2");list.add("from3");fromObservable = Observable.from(list); //遍歷list 每次發(fā)送一個(gè)/** 注意,just()方法也可以傳list,但是發(fā)送的是整個(gè)list對(duì)象,而from()發(fā)送的是list的一個(gè)item** /

1.4 使用defer( ),有觀察者訂閱時(shí)才創(chuàng)建Observable,并且為每個(gè)觀察者創(chuàng)建一個(gè)新的Observable

deferObservable = Observable.defer(new Func0<Observable<String>>() { @Override //注意此處的call方法沒有Subscriber參數(shù) public Observable<String> call() { return Observable.just("deferObservable"); }});

1.5 使用interval( ),創(chuàng)建一個(gè)按固定時(shí)間間隔發(fā)射整數(shù)序列的Observable,可用作定時(shí)器

intervalObservable = Observable.interval(1, TimeUnit.SECONDS);//每隔一秒發(fā)送一次

1.6 使用range( ),創(chuàng)建一個(gè)發(fā)射特定整數(shù)序列的Observable,第一個(gè)參數(shù)為起始值,第二個(gè)為發(fā)送的個(gè)數(shù),如果為0則不發(fā)送,負(fù)數(shù)則拋異常

rangeObservable = Observable.range(10, 5);//將發(fā)送整數(shù)10,11,12,13,14

1.7 使用timer( ),創(chuàng)建一個(gè)Observable,它在一個(gè)給定的延遲后發(fā)射一個(gè)特殊的值,等同于Android中Handler的postDelay( )方法

timeObservable = Observable.timer(3, TimeUnit.SECONDS); //3秒后發(fā)射一個(gè)值

1.8 使用repeat( ),創(chuàng)建一個(gè)重復(fù)發(fā)射特定數(shù)據(jù)的Observable:

repeatObservable = Observable.just("repeatObservable").repeat(3);//重復(fù)發(fā)射3次

2. Observer的創(chuàng)建

// 2.創(chuàng)建觀察者Observer Observer<Student> observer = new Observer<Student>() { @Override public void onCompleted() { System.out.3. 關(guān)聯(lián)Observable 和 Observer 形成 RxJava

有了Observable和Obsever,我們就可以隨便玩了,任取一個(gè)已創(chuàng)建的Observable和Observer關(guān)聯(lián)上,即形成一個(gè)RxJava的例子

// 3.被觀察者訂閱觀察者 observable // 建議在這修改數(shù)據(jù) .map(new Func1<String, String>() { // 第一個(gè)參數(shù)決定 call方法類型,第二個(gè)參數(shù)決定返回值類型 @Override public String call(String arg0) { return arg0 + "湯圓"; } }) .subscribe(observer);

observeronNext方法將會(huì)依次收到來自observable的數(shù)據(jù)”just1”、”just2”,另外,如果你不在意數(shù)據(jù)是否接收完或者是否出現(xiàn)錯(cuò)誤,即不需要ObserveronCompleted()onError()方法,可使用Action1subscribe()支持將Action1作為參數(shù)傳入,RxJava將會(huì)調(diào)用它的call方法來接收數(shù)據(jù),代碼如下:

observable.subscribe(new Action1<String>() { @Override public void call(String s) { LogUtil.log(s); }});

4. talk is cheaper without code

4.1 獲取SD卡中所有以.jpg結(jié)尾的文件

public void getFiles() { String basePath = Environment.getExternalStorageDirectory().getPath(); File rootFile = new File(basePath); Observable.just(rootFile) .flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { return listFiles(file); } }) .filter(new Func1<File, Boolean>() { @Override public Boolean call(File file) { return file.getName().endsWith(".jpg"); } }) .map(new Func1<File, String>() { @Override public String call(File file) { return file.getName(); } }) .toList() .subscribe(new Observer<List<String>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(List<String> lists) { Log.e("test", "onNext: size =" + lists.size()); Log.e("test", "onNext: " + lists); } }); } //遞歸判斷是不是文件夾 private Observable<File> listFiles(File file){ if (file.isDirectory()){ return Observable.from(file.listFiles()).flatMap(new Func1<File, Observable<File>>() { @Override public Observable<File> call(File file) { return listFiles(file); } }); }else { return Observable.just(file); } }

4.2 從數(shù)據(jù)庫(kù)的用戶表查找用戶數(shù)據(jù)

Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //從數(shù)據(jù)庫(kù)獲取用戶表數(shù)據(jù)并賦給userList ··· subscriber.onNext(userList); } }).subscribe(new Action1<List<User>>() { @Override public void call(List<User> users) { //獲取到用戶信息列表 } });

但是,領(lǐng)導(dǎo)突然又不想要所有用戶了,只要名字叫“小明”的用戶,行吧,領(lǐng)導(dǎo)最大,我改(假設(shè)名字唯一):

Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //從數(shù)據(jù)庫(kù)獲取用戶表數(shù)據(jù)并賦給userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).subscribe(new Action1<User>() { @Override public void call(User user) { //拿到謎之小明的數(shù)據(jù) } });

搞定,這時(shí)候領(lǐng)導(dǎo)又說,我不要小明了,我要小明的爸爸的數(shù)據(jù),(坑爹啊~~),我繼續(xù)改:

Observable.create(new Observable.OnSubscribe<List<User>>() { @Override public void call(Subscriber<? super List<User>> subscriber) { List<User> userList = null; ··· //從數(shù)據(jù)庫(kù)獲取用戶表數(shù)據(jù)并賦給userList ··· subscriber.onNext(userList); } }).flatMap(new Func1<List<User>, Observable<User>>() { @Override public Observable<User> call(List<User> users) { return Observable.from(users); } }).filter(new Func1<User, Boolean>() { @Override public Boolean call(User user) { return user.getName().equals("小明"); } }).map(new Func1<User, User>() { @Override public User call(User user) { //根據(jù)小明的數(shù)據(jù)user從數(shù)據(jù)庫(kù)查找出小明的父親user2 return user2; } }).subscribe(new Action1<User>() { @Override public void call(User user2) { //拿到謎之小明的爸爸的數(shù)據(jù) } });

RxJava在需求不斷變更、邏輯愈加復(fù)雜的情況下,依舊可以保持代碼簡(jiǎn)潔、可閱讀性強(qiáng)的一面,沒有各種回調(diào),也沒有謎之縮進(jìn)!


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 井研县| 阳泉市| 商水县| 类乌齐县| 辰溪县| 广元市| 周口市| 嘉祥县| 富顺县| 专栏| 宝应县| 内黄县| 西畴县| 西城区| 梨树县| 清丰县| 新津县| 海口市| 南城县| 昆明市| 衡阳市| 衡阳县| 麦盖提县| 东兰县| 五河县| 马龙县| 明溪县| 乌什县| 浪卡子县| 张家口市| 新津县| 英德市| 波密县| 南安市| 兰坪| 兴安县| 金沙县| 黎城县| 衡南县| 东莞市| 民县|