1. 程式人生 > >retrofit與rxjava使用

retrofit與rxjava使用

retrofit和rxjava(加深)

Android Retrofit + RxJava使用詳解(基礎)rxjava用法subscribeOn訂閱
    /**
     * 傳送訊息
     *
     * @param observable Observable<? extends BaseBean>
     * @param urlOrigin  請求地址
     */
    public void sendMessage(Observable<? extends BaseBean> observable, final String urlOrigin) {
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<BaseBean>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull BaseBean baseBean) {
                        Log.i("http返回:", baseBean.toString() + "");
                        ReceiveMessageManager.getInstance().dispatchMessage(baseBean, urlOrigin);
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

或者像這樣

getUser(userId)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<User>() {
        @Override
        public void onNext(User user) {
            userView.setUser(user);
        }

        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable error) {
            // Error handling
            ...
        }
    });


中文文件

https://mcxiaoke.gitbooks.io/rxdocs/content/

RxJava 的適用場景和使用方式

1. 與 Retrofit 的結合

http://gank.io/post/560e15be2dca930e00da1083

retrofit 和網路框架之前資料彙總

個人比較推薦Square開源組合,用Retrofit(目前已經是2.0+)+OkHttp基本上已經可以處理任何業務場景了,Square開源庫質量還是值得信賴的。Retrofit的特點我個人認為是簡化了網路請求流程,同時自己內部對OkHtttp客戶端做了封裝,同時2.x把之前1.x版本的部分不恰當職責都轉移給OkHttp了(例如Log,目前用OkHttp的Interceptor來實現),這樣的好處是職責清晰,Retrofit做自己該做的事兒。而且Retrofit提供不同的Json Converter實現(也可以自定義),同時提供RxJava支援(返回Observable物件),配合Jackson(或者Gson)和RxJava,再加上Dagger2,你的效率至少可以提高一倍。參見我之前的回答:OkHttp在安卓中的使用? - 知乎使用者的回答目前我所在的公司的技術棧沒用到Volley和android-async-http,如果要用的話,估計還是要做一下二次封裝的。同時推薦用最新的Android Flux來架構你的Android程式,Facebook提出的架構,文件比較全,資料流總是單向的,飛。用過MVC,MVP,我還是是比較認同Flux的,而且之前公司用的架構模式跟Flux也比較像android 網路請求框架給 Android 開發者的 RxJava 詳解RxAndroid 是 RxJava 的擴充套件, 優雅地處理非同步請求. RxAndroid 配合 Lambda 表示式, 精簡處理回撥, 使程式更具有可讀性. 本文詳細介紹使用方法. 歡迎 Follow 我的 GitHub: https://github.com/SpikeKing

彙總 http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html Retrofit 2.0:有史以來最大的改進Retrofit2.0:Android最好用的http庫有史以來最大的更新 android-async-http使用

Post的實現

private AsyncHttpClient asyncHttpClient = new AsyncHttpClient() ;
RequestParams params = new RequestParams();
params.add("version", version);
params.add("platform", Integer.toString(platform));
client.post(url, params, responseHandler);

 1)onStart()  方法是開始傳送請求的時候執行的,一般是把progressDialog放在這裡面顯示,提示使用者等待

    2)onFailure() 如果請求失敗了,就會執行該方法,其餘方法就都不執行了,用於提示使用者網路出現故障

    3)onSuccess() 是請求成功後,伺服器就會返回JSONObject, arg1就是返回的JSONObject, 在裡面解析JSONObject來回去資料,並顯示在UI上

    4)onFinish() 當傳送請求成功後,就執行onFinish()

===============================================================okhttp retrofit離線快取Retrofit2.0+okhttp3實現快取retrofit再度學習Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://www.BaseURL.com/") .addConverterFactory(GsonConverterFactory.create())//自動通過Gson轉josn,上面有提到 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新增RxJava支援 .build();Retrofit學習(一)整合-簡單get請求這個資料比較好【Android】RxJava + Retrofit完成網路請求RxJava觀察者模式首先要先介紹一下觀察者模式(可能比喻的不夠恰當,意思到了就好);
  • 觀察者:監視著被觀察者的行為,當被觀察者某個狀態改變的時候會通知觀察者觀察者會執行對應的操作;
  • 被觀察者:被監視的物件,當某個狀態改變的時候會通知觀察者
  • 訂閱(或註冊):將觀察者被觀察者建立聯絡。
(很亂?來個栗子?)這裡舉一個我個常用的例子,點選Button後觸發OnClickListener中的onClick()事件。在這個事件中他們的角色分別如下:
  • 觀察者:OnClickListener;
  • 被觀察者:Button;
  • 訂閱(或註冊):setOnClickListener()。
RxJava在上面介紹了觀察者模式,這裡也將RxJava中的三個角色進行一下角色分配
  • 觀察者:Observer;
  • 被觀察者:Observable;
  • 訂閱(或註冊):subscribe()。
RXjava 使用rxjava核心功能 : 執行緒的準換, map轉換成不同的事件或事件序列以及flatMap()Subscriber回顧下實現一次RxJava的基本使用。例:分別列印"Hellow"、" Wrod"
        Observable.just("Hello", "World").subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, s);
            }
        });


可以看到,我們這裡只用了onNext(obj),還有兩個重寫的onError(error)和onCompleted()並沒有用到,這樣導致我們多出了幾行根本用不到的程式碼。於是就想能不能只寫我們使用到的,其他幾個沒用到的就不寫,這樣的程式碼看著才舒服。接下來就是使用本次的主角Action來代替SubscriberAction上部分的程式碼使用Action來代替Subscriber得到的程式碼是這樣的:
   Observable.just("Hello","World").

    subscribe(new Action1<String>() {
        @Override public void call (String s){
            Log.i(TAG, s);
        }
    });


舒服多了有沒有!!
  • 什麼是Action
Action是RxJava 的一個介面,常用的有Action0和Action1。Action0: 它只有一個方法 call(),這個方法是無參無返回值的;由於 onCompleted() 方法也是無參無返回值的,因此 Action0 可以被當成一個包裝物件,將 onCompleted() 的內容打包起來將自己作為一個引數傳入 subscribe() 以實現不完整定義的回撥。Ation1:它同樣只有一個方法 call(T param),這個方法也無返回值,但有一個引數;與 Action0 同理,由於 onNext(T obj) 和 onError(Throwable error) 也是單引數無返回值的,因此 Action1 可以將 onNext(obj)和 onError(error) 打包起來傳入 subscribe() 以實現不完整定義的回撥Function與Action1的區別這裡出現了一個叫做 Func1 的類。它和 Action1 非常相似,也是 RxJava 的一個介面,用於包裝含有一個引數的方法。 Func1 和 Action的區別在於, Func1 包裝的是有返回值的方法。另外,和 ActionX 一樣, FuncX 也有多個,用於不同引數個數的方法。FuncX 和 ActionX 的區別在 FuncX 包裝的是有返回值的方法。Schedulers.io()的解釋以及引數Scheduler,RxJava已經為我們提供了一下幾個Scheduler
  • Schedulers.immediate():直接在當前執行緒執行,相當於不指定執行緒。這是預設的 Scheduler。
  • Schedulers.newThread():總是啟用新執行緒,並在新執行緒執行操作。
  • Schedulers.io(): I/O 操作(讀寫檔案、讀寫資料庫、網路資訊互動等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在於 io() 的內部實現是是用一個無數量上限的執行緒池,可以重用空閒的執行緒,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免建立不必要的執行緒。
  • Schedulers.computation():計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的執行緒池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。
  • AndroidSchedulers.mainThread():它指定的操作將在 Android 主執行緒執行。
【Android】RxJava的使用(四)執行緒控制 —— Scheduler感覺比較經典經典中的經典【Android】RxJava + Retrofit完成網路請求3、使用Observable完成一個網路請求,登入成功後儲存資料到本地。Retrofit retrofit =new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新的配置 .baseUrl(BASE_URL) .build(); MyService service = retrofit.create(MyService.class); service.login(phone, password)//獲取Observable物件 .subscribeOn(Schedulers.newThread())//請求在新的執行緒中執行 .observeOn(Schedulers.io())//請求完成後在io執行緒中執行 .doOnNext(new Action1<UserInfo>() { @Override publicvoidcall(UserInfo userInfo) { saveUserInfo(userInfo);//儲存使用者資訊到本地 } }) .observeOn(AndroidSchedulers.mainThread())//最後在主執行緒中執行 .subscribe(new Subscriber<UserInfo>() { @OverridepublicvoidonCompleted() { } @OverridepublicvoidonError(Throwable e) {//請求失敗 } @OverridepublicvoidonNext(UserInfo userInfo) {//請求成功 } });RxJava + Retrofit 形式的時候,Retrofit 把請求封裝進 Observable ,在請求結束後呼叫 onNext() 或在請求失敗後呼叫 onError()。可以看到,呼叫了service的login方法後得到Observable物件,在新的執行緒中執行網路請求,請求成功後切換到io執行緒執行儲存使用者資訊的動作,最後再切換到主執行緒執行請求失敗onError()、請求成功onNext()。整體的邏輯十分清晰都在一條鏈中,就算還有別的要求還可以往裡面新增,絲毫不影響程式碼的簡潔。(終於舉了一個有實際意義的例子)RxJava + Retrofit 進階在上面舉到登入後儲存使用者資訊的例子,其實在做專案的時候,往往在登入後得到的並不是使用者資訊。一般登入後會得到token,然後根據token去獲取使用者的資訊。他們的步驟是這樣的:1、登入2、獲取使用者資訊(前提:登入成功)可以看得出來,這是一個巢狀的結構...巢狀啊!!!天吶,最怕巢狀的結構了。使用RxJava + Retrofit來完成這樣的請求(借用拋物線的例子,稍微做了點改動)//登入,獲取token@GET("/login")public Observable<String> login( @Query("username") String username, @Query("password") String password);//根據token獲取使用者資訊@GET("/user")public Observable<User> getUser( @Query("token") String token);//..................................service.login("11111","22222") .flatMap(new Func1<String, Observable<User>>() {//得到token後獲取使用者資訊 @Overridepublic Observable<User>onNext(String token) {return service.getUser(token); }) .subscribeOn(Schedulers.newThread())//請求在新的執行緒中執行請求 .observeOn(Schedulers.io())//請求完成後在io執行緒中執行 .doOnNext(new Action1<User>() { //儲存使用者資訊到本地 @Overridepublicvoidcall(User userInfo) { saveUserInfo(userInfo); } }) .observeOn(AndroidSchedulers.mainThread())//在主執行緒中執行 .subscribe(new Observer<User>() { @OverridepublicvoidonNext(User user) {//完成一次完整的登入請求 userView.setUser(user); } @OverridepublicvoidonCompleted() { } @OverridepublicvoidonError(Throwable error) {//請求失敗 } });通過一個flatMap()輕鬆完成一次巢狀的請求,而且邏輯十分清晰。so easy~~~這篇文章也是補充的,比較經典【Android】RxJava的使用(三)轉換——map、flatMap可以看到Observable中原來的引數是Student物件,而最後我們需要的是name,這裡使用了map來實現這一轉換的過程。當然,map可以多次使用值得注意的地方文字敘述總歸難理解,上程式碼:Observable.just(1,2,3,4).subscribeOn(Schedulers.io())//指定 subscribe()發生在 IO執行緒.observeOn(AndroidSchedulers.mainThread())//指定 Subscriber的回調發生在主執行緒.subscribe(newAction1<Integer>() {@Overridepublic voidcall(Integernumber) {Log.d(tag,"number:"+number);}});上面這段程式碼中,由於 subscribeOn(Schedulers.io()) 的指定,被建立的事件的內容 1234將會在 IO 執行緒發出;而由於 observeOn(AndroidScheculers.mainThread()) 的指定,因此 subscriber 數字的列印將發生在主執行緒 。事實上,這種在 subscribe() 之前寫上兩句 subscribeOn(Scheduler.io()) 和 observeOn(AndroidSchedulers.mainThread()) 的使用方式非常常見,它適用於多數的 『後臺執行緒取資料,主執行緒顯示』的程式策略。非常的重要Observable 即被觀察者 中的just用法
  • 被觀察者
Observable 即被觀察者,它決定什麼時候觸發事件以及觸發怎樣的事件。可以使用create()、just(T...)、from(T[])或from(Iterable<? extends T>)來建立一個 Observable ,併為它定義事件觸發規則。
  • 訂閱
建立了Observable和Observer之後,再用subscribe()方法將它們聯結起來引數說明rxjava的學習原文連結RxJava正在Android開發者中變的越來越流行。唯一的問題就是上手不容易,尤其是大部分人之前都是使用指令式程式設計語言。但是一旦你弄明白了,你就會發現RxJava真是太棒了。這裡僅僅是幫助你瞭解RxJava,整個系列共有四篇文章,希望你看完這四篇文章之後能夠了解RxJava背後的思想,並且喜歡上RxJava。基礎RxJava最核心的兩個東西是Observables(被觀察者,事件源)和Subscribers(觀察者)。Observables發出一系列事件,Subscribers處理這些事件。這裡的事件可以是任何你感興趣的東西(觸控事件,web介面呼叫返回的資料。。。)一個Observable可以發出零個或者多個事件,知道結束或者出錯。每發出一個事件,就會呼叫它的Subscriber的onNext方法,最後呼叫Subscriber.onNext()或者Subscriber.onError()結束。Rxjava的看起來很想設計模式中的觀察者模式,但是有一點明顯不同,那就是如果一個Observerble沒有任何的的Subscriber,那麼這個Observable是不會發出任何事件的。Hello World建立一個Observable物件很簡單,直接呼叫Observable.create即可rxjava 基礎知識這個比較詳細Lambda在 Steve Yegge 辛辣又幽默的部落格文章裡,描繪了 Java 世界是如何嚴格地以名詞為中心的,如果你還沒看過,趕緊去讀吧,寫得非常風趣幽默,而且恰如其分地解釋了為什麼 Java 要引進 Lambda 表示式。Lambda 表示式為 Java 添加了缺失的函數語言程式設計特點,使我們能將函式當做一等公民看待。儘管不完全正確,我們很快就會見識到 Lambda 與閉包的不同之處,但是又無限地接近閉包。在支援一類函式的語言中,Lambda 表示式的型別將是函式。但是,在 Java 中,Lambda 表示式是物件,他們必須依附於一類特別的物件型別——函式式介面(functional interface)。我們會在後文詳細介紹函式式介面。Mario Fusco 的這篇思路清晰的文章介紹了為什麼 Java 需要 Lambda 表示式。他解釋了為什麼現代程式語言必須包含閉包這類特性。Lambda 表示式簡介Lambda 表示式是一種匿名函式(對 Java 而言這並不完全正確,但現在姑且這麼認為),簡單地說,它是沒有宣告的方法,也即沒有訪問修飾符、返回值宣告和名字。你可以將其想做一種速記,在你需要使用某個方法的地方寫上它。當某個方法只使用一次,而且定義很簡短,使用這種速記替代之尤其有效,這樣,你就不必在類中費力寫宣告與方法了。