iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Mobile Development

Android Studio 30天學習系列 第 24

Android Studio 30天學習-DAY24_Rxjava基本建立學習

  • 分享至 

  • xImage
  •  

Rxjava基礎學習

RxJava是一個可以看到細部資料接收的步驟訊息,這邊先貼上加了Observable的Retrofit執行結果以及程式碼。

前言小小預覽結果及程式碼

  • 近圖

  • 程式碼

    • 這邊先說onNext、onError、onComplete的作用
      • onNext是如果API還有資料的話會一直將我的資料傳回來並接收。
      • onError是有錯誤就會執行。
      • onComplete是如果onNext的資料都接收完了就會來到這裡。

再回到上圖的結果顯示,我這邊是沿用Retrofit的專案附加上Rxjava使用。
近圖這個結果圖可以看到我的ID抓取到了100(假API的上限資料)接著就Complete了。

//Observable模式的Retrofit
    @GET("posts")
    Observable<Response<List<APIResponse>>> observableResponse();

=====================================================================
    
// MainActivity的副程式撰寫
public void GetObservableResponse(){
    apiService.observableResponse()
        .subscribeOn(//要在哪一個線程執行)
        .observeOn(//要載哪一個線程顯示)
        .subscribe(new DisposableObserver<Response<List<APIResponse>>>() {
            @Override
            public void onNext(@NonNull Response<List<APIResponse>> listResponse) {
                //TODO 執行的程式
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG, "onError: "+e );
            }

            @Override
            public void onComplete() {
                Log.e(TAG, "已完成資料接收 ");
            }
        });
}

前言預覽看完後就來到程式碼以及依賴的建立了。

dependencies依賴建立

前面的Retrofit已經建立過的可以跳過Retrofit的dependencies,來到下面的這兩行去做建立。

    //Retrofit2
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation("com.squareup.okhttp3:okhttp:4.10.0")


    // Rxjava
    implementation 'io.reactivex.rxjava3:rxjava:3.1.5'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

    // Retrofit & RxJava
    implementation "com.github.akarnokd:rxjava3-retrofit-adapter:3.0.0"

APIService的微調

這邊我建立兩種形式,一種是Single,另一種是最為基本的Observable。
- Single的回覆就是簡單的有抓到或是沒抓到的回覆結果
- Observable的回覆是向上方預覽的那樣,有onNext、onError、onComplete這三種。

// retrofit建立方式
    @GET("posts")
    Call<List<APIResponse>> response();

------ 分隔線(複製貼上請跳過這行) ------
    
//結合Rxjava的建立方式
    @GET("posts")
    Single<Response<List<APIResponse>>> SingleResponse();


    @GET("posts")
    Observable<Response<List<APIResponse>>> observableResponse();

MainActivity的程式碼

  • Observable的副程式撰寫
    這個的寫法就是前言預覽的方法。

    • 線程控制
    • [subscribeOn][observeOn]都需要一個**scheduler**的參數來指定我們動作所需要的thread(線程)要從哪裡使用。
    • 若是所有工作皆在主線程動作時,就無法同時進行另一個操作,所以就需要Schedule來進行線程的控制來提高效率。
    • 常用的有以下這幾種 scheduler

      1. Schedulers.io()
        如果有網路、檔案存取需求推薦使用,Rxjava 會幫我們管理 ThreadPool reuse 的部分。
      2. Schedulers.computation()
        io線程一樣也是會由 ThreadPool 管理,但是 ThreadPool 的大小跟裝置 CPU 核心數相關。
      3. Schedulers.newThread()
        顧名思義就是每次都會建立新的 Thread,所以稍微耗效能一點。
    • 這邊再補充前面前言預覽空格裡的線程

      • subscribeOn():這邊我是寫Schedulers.io()
      • observeOn()AndroidSchedulers.mainThread(),是指在主線程執行回覆。
public void GetObservableResponse(){
    apiService.observableResponse()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableObserver<Response<List<APIResponse>>>() {
                @Override
                public void onNext(@NonNull Response<List<APIResponse>> listResponse) {
                    for(int i = 0;i<listResponse.body().size();i++){
                        Log.e(TAG, "onNextId: "+listResponse.body().get(i).getId() );
                        Log.e(TAG, "onNextUserId: "+listResponse.body().get(i).getUserId() );
                        Log.e(TAG, "onNextTitle: "+listResponse.body().get(i).getTitle() );
                        Log.e(TAG, "onNextBody: "+listResponse.body().get(i).getBody() );
                    }
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.e(TAG, "onError: "+e );
                }

                @Override
                public void onComplete() {
                    Log.e(TAG, "已完成資料接收 ");
                }
            });
}
  • Single的副程式撰寫
    在這個Single的方法中回覆的方式只有成功接收到回覆以及接收失敗的回覆而已。
    • 程式碼解析:
      • onSuccess():成功接到回覆。
      • onError():接收失敗。
public void GetRxjavaSinglePostsResponse(){
    apiService.SingleResponse()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new DisposableSingleObserver<Response<List<APIResponse>>>() {
                @Override
                public void onSuccess(@NonNull Response<List<APIResponse>> listResponse) {
                    for(int i = 0;i<listResponse.body().size();i++){
                        Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getId() );
                        Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getUserId() );
                        Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getTitle() );
                        Log.e(TAG, "onSuccess: "+listResponse.body().get(i).getBody() );
                    }
                    Log.e(TAG, "onSuccess: "+listResponse );
                }

                @Override
                public void onError(@NonNull Throwable e) {
                    Log.e(TAG, "onError: "+e );
                }
            } );
}

結果圖

  1. Observable接收結果
  2. Single的接收結果

可能遇到的問題

  1. SiteManager的更改微調
    這邊可能需要加上.addCallAdapterFactory(RxJava3CallAdapterFactory.create())才能正常回覆出資訊結果。
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://jsonplaceholder.typicode.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        .build();
  1. dependencies需要特別注意版本問題。

以上是今天的Rxjava的基本建立學習以及結合Retrofit的實作。


上一篇
Android Studio 30天學習-DAY23_Retrofit基本設置
下一篇
Android Studio 30天學習-DAY25_Glide基礎建立
系列文
Android Studio 30天學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言