Android RxJava+Retrofit2+RxBinding

Android RxJava+Retrofit2+RxBinding

本文原創(chuàng)像屋,轉(zhuǎn)載請注明出處掠河。歡迎關(guān)注我的 簡書拍柒。
安利一波我寫的開發(fā)框架:MyScFrame喜歡的話就給個Star

前言:

之前寫了一篇名為Android 手把手教你使用Retrofit2的文章,只是單純并簡單的介紹了下Retrofit2的使用,現(xiàn)在我們把它跟RxJava以及RxBinding關(guān)聯(lián)起來,看看效果如何

添加依賴

RxBinding的依賴比較麻煩,是按控件包區(qū)分的,我這邊只用到了基礎(chǔ)包也就是android.widget.所以只引入了compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'

    //全新網(wǎng)絡(luò)請求框架Rxjava+RxAndroid+ReTrofit2+okHttp3
    compile 'com.tamic.novate:novate:1.2.7'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    //日志攔截器
    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
    compile 'io.reactivex:rxjava:1.2.4'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
    //RxBinding
    compile 'com.jakewharton.rxbinding:rxbinding:1.0.0'
//    compile 'com.jakewharton.rxbinding:rxbinding-support-v4:1.0.0'
//    compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:1.0.0'
//    compile 'com.jakewharton.rxbinding:rxbinding-design:1.0.0'
//    compile 'com.jakewharton.rxbinding:rxbinding-recyclerview-v7:1.0.0'

開始關(guān)聯(lián)

MyRetrofit2Service差異

在使用RxJava之前是這樣的

    @POST()
    Call<HttpResult<News>> post(@Url String url, @QueryMap Map<String, String> map);

使用了RxJava之后是這樣的

    @POST()
    Observable<HttpResult<News>> rxPost(@Url String url, @QueryMap Map<String, String> map);

MyRetrofit2調(diào)用方法上的差異

在使用RxJava之前是這樣的

    /**
     * 異步調(diào)用
     */
    public void getEnqueue() {
        Call<HttpResult<News>> call = mApi.post(NEWS_URI, params);
        call.enqueue(new Callback<HttpResult<News>>() {
            @Override
            public void onResponse(Call<HttpResult<News>> call, Response<HttpResult<News>> response) {
                //處理請求成功
                Log.e("OkHttp", "處理成功請求 response = " + response.body().toString());
            }

            @Override
            public void onFailure(Call<HttpResult<News>> call, Throwable t) {
                //處理請求失敗
                Log.e("OkHttp", "處理失敗請求");
            }
        });
//        cancelCall(call);
    }

使用了RxJava之后是這樣的

    public void RxJavaGetEnqueue(Subscriber<News> subscriber) {
        Observable observable = mApi.rxPost(NEWS_URI, params)
                .map(new HttpResultFunc<News>());

        toSubscribe(observable, subscriber);
    }

    private <T> void toSubscribe(Observable<T> o, Subscriber<T> s) {
        o.subscribeOn(Schedulers.io())//設(shè)置事件觸發(fā)在非主線程
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())//在主線程處理返回數(shù)據(jù)
                .subscribe(s);
    }

    /**
     * 用來統(tǒng)一處理Http的resultCode,并將HttpResult的Data部分剝離出來返回給subscriber
     *
     * @param <T> Subscriber真正需要的數(shù)據(jù)類型,也就是Data部分的數(shù)據(jù)類型
     */
    private class HttpResultFunc<T> implements Func1<HttpResult<T>, T> {

        @Override
        public T call(HttpResult<T> httpResult) {
            Log.e("OkHttp", "HttpResultFunc httpResult = " + httpResult.toString());
            if ("200".equals(httpResult.getStatus_code()) && httpResult.isSuccess()) {
                return httpResult.getData();
            }
            throw new ApiException(httpResult.getStatus_code());
        }
    }

初看代碼量變多了,沒錯,是變多了,但是誰叫他最近比較火呢,而且目前我只是實現(xiàn)比較簡單的場景,還沒發(fā)揮出RxJava的真正功效呢.
這里需要說下HttpResultFunc<T>方法的作用,好用就好用在這里,這里我是根據(jù)網(wǎng)絡(luò)請求的code跟success兩個參數(shù)判斷是否是成功的,如果是成功返回,那就返回data,如果是錯誤的話,自己寫了個ApiException類是用來處理錯誤信息的

/**
 * Created by caihan on 2017/1/14.
 */
public class ApiException extends RuntimeException {

    public static final int WRONG_1 = 100;
    public static final int WRONG_2 = 101;

    public ApiException(int resultCode) {
        this(getApiExceptionMessage(resultCode));
    }

    public ApiException(String detailMessage) {
        super(detailMessage);
    }

    /**
     * 由于服務(wù)器傳遞過來的錯誤信息直接給用戶看的話猾警,用戶未必能夠理解
     * 需要根據(jù)錯誤碼對錯誤信息進(jìn)行一個轉(zhuǎn)換,在顯示給用戶
     *
     * @param code
     * @return
     */
    private static String getApiExceptionMessage(int code) {
        String message = "";
        switch (code) {
            case WRONG_1:
                message = "錯誤1";
                break;
            case WRONG_2:
                message = "錯誤2";
                break;
            default:
                message = "未知錯誤";
        }
        return message;
    }
}

界面上調(diào)用方式的變化

之前是這樣的

MyRetrofit2.getInstance().getEnqueue();

現(xiàn)在是這樣子的

    private void rxGet() {
        MyRetrofit2.getInstance().RxJavaGetEnqueue(new Subscriber<News>() {
            @Override
            public void onCompleted() {
                Log.e("OkHttp", "rxGet onCompleted");
            }

            @Override
            public void onError(java.lang.Throwable e) {
                Log.e("OkHttp", "rxGet onError e= " + e.toString());
            }

            @Override
            public void onNext(News news) {
                Log.e("OkHttp", "rxGet onNext news= " + news.toString());
            }
        });
    }

用RxBinding處理頻繁點(diǎn)擊問題

開發(fā)中大家都會遇到這類問題,用戶不(gui)小(cai)心(xin)點(diǎn)擊了N次Button,導(dǎo)致Button相應(yīng)了N次,之前我是寫了個DoubleClick類,專門處理此類事件,相信大家也都會,現(xiàn)在有了RxBinding,解放了

        RxView.clicks(mButton)
                .throttleFirst(1, TimeUnit.SECONDS)
                .subscribe(new Action1<Void>() {

                    @Override
                    public void call(Void o) {
                        Log.d("OkHttp", "clickAction call");
                        rxGet();
                    }
                });

throttleFirst()方法就是處理這種不小心事件,它會把設(shè)置時間內(nèi)的其他響應(yīng)事件過濾掉,怎么樣,是不是很好用呀...其他的控件如何處理我這邊就不寫了,大家感興趣的話可以看看相關(guān)資料

資料

急速開發(fā)系列——RxJava實戰(zhàn)技巧大全
RxBinding詳解: 規(guī)范而強(qiáng)大的安卓UI響應(yīng)式編程
初涉Rx套餐 之RxBinding(讓你的事件流程更清晰)


總結(jié)

響應(yīng)式開發(fā)我也還在摸索當(dāng)中,這里沒做過多的封裝,因為還有很多地方?jīng)]搞懂,最近也是一直在找相關(guān)的資料.如果大家在其他地方看到了一些相關(guān)的優(yōu)秀文章,可以分享給我,謝謝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隆敢,一起剝皮案震驚了整個濱河市发皿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拂蝎,老刑警劉巖穴墅,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異温自,居然都是意外死亡玄货,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門捣作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉结,“玉大人鹅士,你說我怎么就攤上這事券躁。” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵也拜,是天一觀的道長以舒。 經(jīng)常有香客問我,道長慢哈,這世上最難降的妖魔是什么蔓钟? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮卵贱,結(jié)果婚禮上滥沫,老公的妹妹穿的比我還像新娘。我一直安慰自己键俱,他們只是感情好兰绣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著编振,像睡著了一般缀辩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踪央,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天臀玄,我揣著相機(jī)與錄音,去河邊找鬼畅蹂。 笑死健无,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魁莉。 我是一名探鬼主播睬涧,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旗唁!你這毒婦竟也來了畦浓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤检疫,失蹤者是張志新(化名)和其女友劉穎讶请,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屎媳,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夺溢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烛谊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片风响。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丹禀,靈堂內(nèi)的尸體忽然破棺而出状勤,到底是詐尸還是另有隱情鞋怀,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布持搜,位于F島的核電站密似,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葫盼。R本人自食惡果不足惜残腌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贫导。 院中可真熱鬧抛猫,春花似錦、人聲如沸孩灯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱反。三九已至掖看,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間面哥,已是汗流浹背哎壳。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尚卫,地道東北人归榕。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像吱涉,于是被迫代替她去往敵國和親刹泄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容