国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

RxJava系列七(最佳實(shí)踐)

Carson / 994人閱讀

摘要:按照計(jì)劃這一期是要介紹框架結(jié)構(gòu)和設(shè)計(jì)思想的,但是考慮到將在十月底發(fā)布正式版因此決定將框架結(jié)構(gòu)和設(shè)計(jì)思想分析放到正式版發(fā)布后再做。后續(xù)我也會(huì)有一系列的文章來(lái)介紹和的區(qū)別。首選我們需要調(diào)用系統(tǒng)來(lái)獲取所有已安裝的,所以在的方法中調(diào)用。

轉(zhuǎn)載請(qǐng)注明出處:[https://zhuanlan.zhihu.com/p/...

RxJava系列1(簡(jiǎn)介)

RxJava系列2(基本概念及使用介紹)

RxJava系列3(轉(zhuǎn)換操作符)

RxJava系列4(過(guò)濾操作符)

RxJava系列5(組合操作符)

RxJava系列6(從微觀角度解讀RxJava源碼)

RxJava系列7(最佳實(shí)踐)

前言

有點(diǎn)標(biāo)題黨了,其實(shí)談不上什么最佳實(shí)踐。前段時(shí)間公司實(shí)行996,所以也沒(méi)什么時(shí)間和精力來(lái)更新博客(好吧~我承認(rèn)是我懶~)。因此這篇文章只是簡(jiǎn)單的通過(guò)兩個(gè)例子介紹了RxJava在生產(chǎn)環(huán)境中的使用。不過(guò)本篇中的每個(gè)例子我都配上了完整的代碼。

按照計(jì)劃這一期是要介紹RxJava框架結(jié)構(gòu)和設(shè)計(jì)思想的,但是考慮到Netflix將在十月底發(fā)布RxJava2.0正式版;因此決定將RxJava框架結(jié)構(gòu)和設(shè)計(jì)思想分析放到2.0正式版發(fā)布后再做。后續(xù)我也會(huì)有一系列的文章來(lái)介紹RxJava1.x和2.x的區(qū)別。

示例一、獲取手機(jī)上已安裝的App

第一個(gè)例子我們需要在Android設(shè)備上展示已安裝的第三方app列表,關(guān)于環(huán)境搭建、依賴配置、RecyclerView的使用等這些基礎(chǔ)內(nèi)容我就不做陳述了。需要了解的同學(xué)可以去GitHub上把項(xiàng)目clone下來(lái)看看。這里我主要講講如何通過(guò)RxJava實(shí)現(xiàn)核心功能。

首選我們需要調(diào)用系統(tǒng)api來(lái)獲取所有已安裝的app,所以在OnSubscribecall方法中調(diào)用getApplicationInfoList()。但是getApplicationInfoList()獲取的數(shù)據(jù)并不能完全滿足我們的業(yè)務(wù)需求:

由于我們只需要展示手機(jī)上已安裝的第三方App,因此需要通過(guò)filter操作符來(lái)過(guò)濾掉系統(tǒng)app;

ApplicationInfo并不是我們所需要的類型,因此需要通過(guò)map操作符將其轉(zhuǎn)換為AppInfo

由于獲取ApplicationInfo、過(guò)濾數(shù)據(jù)、轉(zhuǎn)換數(shù)據(jù)相對(duì)比較耗時(shí),因此需要通過(guò)subscribeOn操作符將這一系列操作放到子線程中來(lái)處理;

而要將信息展示在頁(yè)面上涉及到UI操作,因此需要通過(guò)observeOn操作符將onNextonCompletedonError調(diào)度到主線程,接著我們?cè)谶@些方法中更新UI。

下面是核心代碼:

final PackageManager pm = MainActivity.this.getPackageManager();
Observable.create(new Observable.OnSubscribe() {
        @Override
        public void call(Subscriber subscriber) {
            List infoList = getApplicationInfoList(pm);
            for (ApplicationInfo info : infoList) {
                subscriber.onNext(info);
            }
            subscriber.onCompleted();
        }
    }).filter(new Func1() {
        @Override
        public Boolean call(ApplicationInfo applicationInfo) {
            return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0;
        }
    }).map(new Func1() {

        @Override
        public AppInfo call(ApplicationInfo applicationInfo) {
            AppInfo info = new AppInfo();
            info.setAppIcon(applicationInfo.loadIcon(pm));
            info.setAppName(applicationInfo.loadLabel(pm).toString());
            return info;
        }
    }).subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Subscriber() {
        @Override
        public void onCompleted() {
            mAppListAdapter.notifyDataSetChanged();
            mPullDownSRL.setRefreshing(false);
        }

        @Override
        public void onError(Throwable e) {
            mPullDownSRL.setRefreshing(false);
        }

        @Override
        public void onNext(AppInfo appInfo) {
            mAppInfoList.add(appInfo);
        }
    });

程序執(zhí)行效果圖:


完整的代碼我放到了GitHub上,有興趣大家可以去clone下來(lái)自己運(yùn)行看看。

源碼地址:https://github.com/BaronZ88/HelloRxAndroid

示例二、RxJava+Retrofit2實(shí)現(xiàn)獲取天氣數(shù)據(jù)

RxJava + Retrofit2幾乎是Android應(yīng)用開(kāi)發(fā)的標(biāo)配了,這個(gè)例子中我們就來(lái)聊聊這二者是如何配合起來(lái)幫助我們快速開(kāi)發(fā)的。

Retrofit2中一個(gè)標(biāo)準(zhǔn)的接口定義是這樣的:

@GET("weather")
Observable getWeather(@Query("cityId") String cityId);

現(xiàn)在有了RxJava,一個(gè)基本的網(wǎng)絡(luò)請(qǐng)求我們便可以這樣實(shí)現(xiàn):

ApiClient.weatherService.getWeather(cityId)
                 .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1() {
                    @Override
                    public void call(Weather weather) {
                        weatherView.displayWeatherInformation(weather);
                    }
                });

但有時(shí)候可能一開(kāi)始我們并不知道cityId,我們只知道cityName。所以就需要我們先訪問(wèn)服務(wù)器,拿到對(duì)應(yīng)城市名的cityId,然后通過(guò)這個(gè)cityId再去獲取天氣數(shù)據(jù)。

同樣的,我們需要定義一個(gè)獲取cityId的接口:

@GET("city")
Observable getCityIdByName(@Query("cityName") String cityName);

緊接著我們便可以使用無(wú)所不能的RxJava來(lái)實(shí)現(xiàn)需求了。

ApiClient.weatherService.getCityIdByName("上海")
             .flatMap(new Func1>() {
                 @Override
                 public Observable call(String cityId) {
                     return ApiClient.weatherService.getWeather(cityId);
                 }
             }).subscribeOn(Schedulers.io())
             .observeOn(AndroidSchedulers.mainThread())
             .subscribe(new Action1() {
                 @Override
                 public void call(Weather weather) {
                     weatherView.displayWeatherInformation(weather);
                 }
             });

哇哦!~ so easy!!!媽媽再也不用擔(dān)心....

源碼地址:https://github.com/BaronZ88/WeatherStyle

WeatherStyle)這個(gè)項(xiàng)目還在開(kāi)發(fā)中,這個(gè)項(xiàng)目不只包含了RxJava和Retrofit的使用,同時(shí)還包含MVP、ORMLite、RetroLambda、ButterKnife等等開(kāi)源庫(kù)的使用

RxJava1.X的系列文章就到此結(jié)束了,由于本人對(duì)RxJava的理解有限,這一系列文章中如有錯(cuò)誤還請(qǐng)大家指正。在使用RxJava過(guò)程中有任何疑問(wèn)也歡迎大家和我交流。共同學(xué)習(xí)!共同進(jìn)步!

好啦,我們RxJava2見(jiàn)!~

如果大家喜歡這一系列的文章,歡迎關(guān)注我的知乎專欄和GitHub。

知乎專欄:https://zhuanlan.zhihu.com/baron

GitHub:https://github.com/BaronZ88

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66532.html

相關(guān)文章

  • RxJava系列番外篇:一個(gè)RxJava解決復(fù)雜業(yè)務(wù)邏輯的案例

    摘要:之前寫(xiě)過(guò)一系列的文章,也承諾過(guò)會(huì)盡快有的介紹。所以這次還是給大家分享一個(gè)使用解決問(wèn)題的案例,希望對(duì)大家在使用的時(shí)候有一點(diǎn)點(diǎn)啟發(fā)。上述這一套復(fù)雜的業(yè)務(wù)邏輯如果使用傳統(tǒng)編碼方式將是極其復(fù)雜的。 之前寫(xiě)過(guò)一系列RxJava1的文章,也承諾過(guò)會(huì)盡快有RxJava2的介紹。無(wú)奈實(shí)際項(xiàng)目中還未真正的使用RxJava2,不敢妄動(dòng)筆墨。所以這次還是給大家分享一個(gè)使用RxJava1解決問(wèn)題的案例,希望對(duì)...

    EscapedDog 評(píng)論0 收藏0
  • RxJava系列六(從微觀角度解讀RxJava源碼)

    摘要:而這個(gè)就是線程調(diào)度的關(guān)鍵前面的例子中我們通過(guò)指定了發(fā)射處理事件以及通知觀察者的一系列操作的執(zhí)行線程,正是通過(guò)這個(gè)創(chuàng)建了我們前面提到的。總結(jié)這一章以執(zhí)行流程操作符實(shí)現(xiàn)以及線程調(diào)度三個(gè)方面為切入點(diǎn)剖析了源碼。 轉(zhuǎn)載請(qǐng)注明出處:https://zhuanlan.zhihu.com/p/22338235 RxJava系列1(簡(jiǎn)介) RxJava系列2(基本概念及使用介紹) RxJava系列3...

    zero 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<