成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

最適合使用RxJava處理的四種場(chǎng)景

新聞 移動(dòng)開(kāi)發(fā)
RxJava是非常熱門(mén)的函數(shù)響應(yīng)式編程庫(kù),在Android開(kāi)發(fā)中已經(jīng)非常流行了,剛開(kāi)始上手會(huì)有點(diǎn)難,但只要理解了它,就再也回不去了。

RxJava是非常熱門(mén)的函數(shù)響應(yīng)式編程庫(kù),在Android開(kāi)發(fā)中已經(jīng)非常流行了,剛開(kāi)始上手會(huì)有點(diǎn)難,但只要理解了它,就再也回不去了;不使用RxJava寫(xiě)異步請(qǐng)求的話,就感覺(jué)各種不爽。

[[201947]]

本文不準(zhǔn)備講RxJava的基礎(chǔ)知識(shí),如果你對(duì)RxJava不熟悉,這里有篇不錯(cuò)的教程可以參考 《給 Android 開(kāi)發(fā)者的 RxJava 詳解》 。

下面我們開(kāi)始介紹RxJava最適合使用的四種場(chǎng)景,代碼示例基于RxJava1

場(chǎng)景一: 單請(qǐng)求異步處理

由于在Android UI線程中不能做一些耗時(shí)操作,比如網(wǎng)絡(luò)請(qǐng)求,大文件保存等,所以在開(kāi)發(fā)中經(jīng)常會(huì)碰到異步處理的情況,我們最典型的使用場(chǎng)景是RxJava+Retrofit處理網(wǎng)絡(luò)請(qǐng)求

MyService myService = retrofit.create(MyService.class);
myService.getSomething()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);

為了使代碼看起來(lái)簡(jiǎn)潔點(diǎn),這邊還使用了lambda表達(dá)式, updateUI 和 showError 需要在當(dāng)前類中實(shí)現(xiàn),比如:

public void updateUI(Data data){
      //TODO something
}

public void showError(throwable t){
      //show error msg
}

場(chǎng)景二: 多異步請(qǐng)求連續(xù)調(diào)用

這種場(chǎng)景其實(shí)也很常見(jiàn),我們做用戶頭像編輯的使用,一般就會(huì)有三個(gè)請(qǐng)求需要連續(xù)調(diào)用:

  1. 請(qǐng)求頭像上傳的地址
  2. 上傳頭像
  3. 更新用戶信息

在平時(shí)的代碼里,我們需要一步步callback嵌套下來(lái),代碼冗長(zhǎng)太難看,而且不好維護(hù),使用RxJava鏈?zhǔn)秸{(diào)用處理代碼邏輯就會(huì)非常清晰

Observable.just(1)
  .map(this::task1)
  .map(this::task2)
  .map(this::task3)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(this::updateUI, this::showError);

這里的just發(fā)送的固定值1,沒(méi)有實(shí)際意義,只是我覺(jué)得這樣更信息

你也可以用Observable.create創(chuàng)建observable。

場(chǎng)景三: 多異步請(qǐng)求合并處理

有時(shí)候在項(xiàng)目中,我們會(huì)碰到組合多個(gè)請(qǐng)求的結(jié)果后,再更新UI的情況,比如我們項(xiàng)目中就有一個(gè)從多個(gè)請(qǐng)求地址獲取通知數(shù)據(jù),然后在APP上再按時(shí)間順序組合后展示的需求,這時(shí)候我們就可以用RxJava的zip函數(shù)來(lái)處理了

MyService myService = retrofit.create(MyService.class);
Observable o1 = myService.getNotification1();
Observable o2 = myService.getNotification2();
Observable.zip(o1,o2, this::combiNotification)
             .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::updateUI, this::showError);


public List<Notification> combiNotification(List<Notification> n1, List<Notification> n2){
      //TODO 合并通知列表
}

zip函數(shù)會(huì)等待兩個(gè)請(qǐng)求都完成后,調(diào)用我們的合并方法combiNotification,等合并處理后再回調(diào)subscribe中的方法。

場(chǎng)景四: 定時(shí)輪詢

RxJava還特別適合對(duì)定時(shí)輪詢?nèi)蝿?wù)的處理, 一種典型的例子就是APP提交了一個(gè)任務(wù)給后臺(tái)異步處理,假設(shè)后臺(tái)處理需要1-2分鐘左右,我們需要定時(shí)到后臺(tái)查詢進(jìn)度,并更新到UI上, 傳統(tǒng)的做法是用Handler的postDelay方法,用RxJava實(shí)現(xiàn)的話就會(huì)非常簡(jiǎn)潔

Subscription subscription =  Observable.interval(2, TimeUnit.SECONDS)
                .map(this::getProgress)
                .takeUntil(progress -> progress !=  100)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Long>() {
                    @Override
                    public void onCompleted() {
                        //TODO finished
                    }

                    @Override
                    public void onError(Throwable e) {
                    }

                    @Override
                    public void onNext(int progress) {
                         //TODO update progress
                    }
                });

我們以定時(shí)2秒查詢一次,直到進(jìn)度progress=100為止,自動(dòng)終止輪詢。

以上各種RxJava方法都是異步耗時(shí)調(diào)用,考慮到Activity的退出時(shí)請(qǐng)求還沒(méi)有完成,我們需要在Activity的OnDestroy方法中取消RxJava調(diào)用

subscription.unsubscribe();
責(zé)任編輯:張燕妮 來(lái)源: 推酷
相關(guān)推薦

2020-11-24 05:59:41

容器

2020-03-17 15:55:12

Redis數(shù)據(jù)庫(kù)命令

2017-04-07 11:30:04

人工智能開(kāi)發(fā)編程語(yǔ)言

2018-09-25 07:08:52

IAM身份及訪問(wèn)管理網(wǎng)絡(luò)安全

2021-02-14 10:09:04

數(shù)據(jù)目錄數(shù)據(jù)元數(shù)據(jù)

2018-09-07 06:30:50

物聯(lián)網(wǎng)平臺(tái)物聯(lián)網(wǎng)IOT

2016-01-26 09:58:28

云存儲(chǔ)云服務(wù)云安全

2009-01-19 16:54:50

數(shù)據(jù)挖掘CRM孤立點(diǎn)

2009-07-16 10:53:11

iBATIS 使用

2012-12-13 21:50:43

2016-07-14 16:27:54

linux

2018-01-05 08:53:32

LinuxUbuntu發(fā)行版

2019-03-10 22:21:47

框架AI開(kāi)發(fā)

2020-06-24 07:49:13

Kubernetes場(chǎng)景網(wǎng)絡(luò)

2020-11-10 10:08:41

Kubernetes容器開(kāi)發(fā)

2018-07-16 08:50:31

固態(tài)硬盤(pán)內(nèi)存

2012-03-20 09:32:24

Linux服務(wù)器

2017-03-09 13:30:13

Linux游戲AMD

2014-08-19 15:05:08

Linux

2020-12-31 11:42:23

Linux編程字體代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲综合日韩精品欧美综合区 | 国产成人精品久久二区二区 | 黄色大片在线免费观看 | 狠狠色综合久久丁香婷婷 | 一级做a爰片性色毛片16 | 成人欧美一区二区三区色青冈 | 麻豆av电影网 | 一区二区福利视频 | 成人欧美在线 | 欧美不卡一区二区三区 | 日韩欧美网 | 国产99久久久久 | 久久久久国产一区二区三区 | 男女在线网站 | 久久久久久久国产 | 欧美日韩国产三级 | 性视频网 | 超碰成人免费观看 | 日韩一区精品 | 亚洲性视频 | 国产一区二区在线观看视频 | 日韩欧美在 | 男女精品网站 | 国产福利视频 | a在线免费观看 | 国产精品久久久久久久久免费相片 | 国产一区二区三区不卡av | 日韩精品一区二区三区四区 | 中文字幕在线观 | 午夜一级大片 | 午夜久久久 | 黄网站免费在线 | 一区欧美 | 亚洲精品v日韩精品 | 综合久久亚洲 | 人人人人干 | 一区二区三区免费网站 | 荷兰欧美一级毛片 | 国产亚洲欧美在线 | 欧美日韩在线一区二区三区 | 狠狠久|