讓我的專案也使用RxJava+OkHttp+Retrofit

firefule發表於2021-09-09
,是我找工作期間自己做的一個小Demo。花了一點時間完成後,便在簡書上與大家分享 ,竟然在一天之間收到那麼多的喜歡:

圖片描述

這讓我這個小菜鳥是萬萬沒有想到的,所以在這我要感謝所有給我鼓勵,給我建議的擼友們,謝謝你們,我會努力的!

之前專案用的是 OkHttp 的開源框架完成的網路請求,但是我們程式設計師要跟得上時代的潮流!
圖片描述

可以發現 RxJava 和 Retrofit 位居排行榜的第一第三,由此可見學習RxJava+Retrofit的必要性!

於是,我花了兩天的時間學習了一下 Retrofit 和 RxJava,發現RxJava 真TM強呀!相見恨晚哪!

因為花的時間不多,所以只瞭解到一些皮毛,然後趁熱打鐵,嘗試著在自己的專案中加入這個強大的框架,有些細節可能處理的不好,請多多指教!

先宣告:本篇文章只介紹如何簡單的使用 Retrofit+RxJava, 詳細部分就請大家自己查詢資料,因為本人知道也太少...

推薦覺得比較好的文章:


首先將需要新增的依賴全部新增,後面就不贅述了。

//Retrofit
compile 'com.squareup.retrofit2:retrofit:2.2.0'
//Retrofit透過GSON將結果轉換為Bean物件
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
//讓Retrofit支援RxJava
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//RxJava
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
//日誌攔截器
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

還是先來一波結果演示圖:

圖片描述

我就拿我的專案中模組來進行修改,資料還是來源 。

這個平臺獲取到資料,當你從這個平臺申請到這個服務,他會給你一個介面和Appkey,然後透過查詢引數可以獲取相應的資料。

這裡我就把我的 Appkey 無私的貢獻出來

這是我的資料介面

相信大家都能看的懂吧,除了固定 url,後面引數分別代表 開發者的 AppKey、獲取資料的頁數和每頁顯示的條數。

這是我從伺服器獲取到的 json 資料:

{
    "error_code": 0,
    "reason": "Success",
    "result": {"data": [{
        "content": "一男子跟朋友走在路上,突然發現五個女人正在圍毆其丈母孃!  朋友見狀,忙問男子:u201c你還不趕緊上去幫忙?!u201d  男子鎮定地說:u201c不用,五個人足夠了!u201d",
        "hashId": "0a8b6fdd70daa311aa82a771132d9895",
        "unixtime": 1487980430,
        "updatetime": "2017-02-25 07:53:50"
    }]}
}

然後透過 Android Studio 外掛 GsonFormat 自動生成 javaBean 物件,這裡我就不把程式碼貼出來了,太多了。

2. 建立服務介面和獲取資料的方法
public interface QNewsService {

    public static final String DESC = "desc"; // 指定時間之前釋出的
    public static final String ASC = "asc";   // 指定時間之後釋出的

    /**
     * 查詢最新的段子資料
     * 
     * @param page      查詢的頁數
     * @param pagesize  一頁資料顯示的條數
     * @return          查詢結束返回的被觀察者
     */
    //介面完整地址
    // 
    @GET("text.from?key=ae240f7fba620fc370b803566654949e")
    Observable getCurrentJokeData(
            @Query("page") int page,
            @Query("pagesize") int pagesize
    );

    /**
     * 根據指定的時間,獲取相關的段子資料
     * 
     * @param time          要指定查詢的時間
     * @param page          查詢的頁數
     * @param pagesize      一頁資料顯示的條數
     * @param sort          判斷是在指定時間之前還是之後
     *                          {@value DESC 指定之前},{@value ASC 指定之後}
     * @return              查詢結束返回的被觀察者
     */
    //介面完整地址
    // 
    @GET("list.from?key=ae240f7fba620fc370b803566654949e")
    Observable getAssignJokeData(
            @Query("time") long time,
            @Query("page") int page,
            @Query("pagesize") int pagesize,
            @Query("sort") String sort
    );

}

@GET: 請求方法為 GET

("text.from?key=ae240f7fba620fc370b803566654949e"):除去 baseUrl,因為 AppKey 值固定,就可以直接寫進去,要查詢的單獨列出來

Observable:這個就是 RxJava+Retrofit 的簡單結合體,當你從伺服器獲取資料直接返回JavaBean物件,是不是很強大,然後把它有轉換成 被觀察者,方便後面事件的傳遞。

@Query("page") int page:透過 @Query 來設定查詢條件

3. 建立客戶端
public class QClitent {

    private static QClitent mQClient;
    private Retrofit mRetrofit;

    private QClitent(){
        mRetrofit = createRetrofit();
    }

    public static QClitent getInstance() {
        if (mQClient == null){
            synchronized (QClitent.class){
                if (mQClient == null){
                    mQClient = new QClitent();
                }
            }
        }
        return mQClient;
    }
    /**
    * 建立相應的服務介面
    */
    public  T create(Class service){
        checkNotNull(service, "service is null");
        return mRetrofit.create(service);
    }
    /**
     * 直接建立 QNewsService
     */ 
    public QNewsService createQNewsService(){
        return mRetrofit.create(QNewsService.class);
    }

    private   T checkNotNull(T object, String message) {
        if (object == null) {
            throw new NullPointerException(message);
        }
        return object;
    }

    private Retrofit createRetrofit() {
        //初始化OkHttp
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(9, TimeUnit.SECONDS)    //設定連線超時 9s
                .readTimeout(10, TimeUnit.SECONDS);      //設定讀取超時 10s

        if (BuildConfig.DEBUG) { // 判斷是否為debug
            // 如果為 debug 模式,則新增日誌攔截器
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(interceptor);
        }

        // 返回 Retrofit 物件
        return new Retrofit.Builder()
                .baseUrl(Constants.BASE_JOKE_URL)
                .client(builder.build()) // 傳入請求客戶端
                .addConverterFactory(GsonConverterFactory.create()) // 新增Gson轉換工廠
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 新增RxJava2呼叫適配工廠
                .build();

    }
}

這裡採用 單例模式 獲取 Retrofit 物件,建立相應的服務介面。

註釋寫的比較詳細,我就不多說了。

4. 使用 RxJava 完成非同步請求
private void updateDate() {
    srlJoke.setRefreshing(true);    // 讓SwipeRefreshLayout開啟重新整理
    QClitent.getInstance()
            .create(QNewsService.class) // 建立服務
            .getCurrentJokeData(1, 8)   // 查詢
            .subscribeOn(Schedulers.io())   //  指定被觀察者的操作在io執行緒中完成
            .observeOn(AndroidSchedulers.mainThread())  // 指定觀察者接收到資料,然後在Main執行緒中完成
            .subscribe(new Consumer() {
                @Override
                public void accept(JokeBean jokeBean) throws Exception {
                    // 成功獲取資料
                    mAdapter.setNewData(jokeBean.getResult().getData());    // 給介面卡設定資料
                    srlJoke.setRefreshing(false);       // 讓SwipeRefreshLayout關閉重新整理
                }
            }, new Consumer() {
                @Override
                public void accept(Throwable throwable) throws Exception {
                    // 獲取資料失敗
                    Toast.makeText(getActivity(), "獲取資料失敗", Toast.LENGTH_SHORT).show();
                    srlJoke.setRefreshing(false);
                }
            });
}

RxJavaGitHub 主頁上的自我介紹是"a library for composing asynchronous and event-based programs using observable sequences for the Java VM"
(一個在 Java VM 上使用可觀測的序列來組成非同步的、基於事件的程式的庫)。這就是 RxJava ,概括得非常精準。

透過強大的鏈式呼叫,一目瞭然,簡單迅速的完成了網路的非同步請求和資料載入。這就是 RxJava+Retrofit 的強大之處!其實這只是一小部分,RxJava 的功能遠不止於此,強大的運算子基本上可以完成專案中所有事件傳遞的需要,推薦大家,一定好好研究一下這個強大的框架!

最後的結果就是這樣,跟之前沒什麼太大區別:

圖片描述

好了,到此,簡單的 RxJava+Retrofit 小應用就結束了,雖然目前還是沒有找到工作,但是絲毫不影響我繼續學習下去,我相信,肯定有一家公司願意收留我的!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2810736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章