iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0

RxJava3

特點:

  1. 非同步處理更簡潔:取代傳統 callback 寫法
  2. 控制執行緒更方便:透過 .subscribeOn() 與 .observeOn() 控制工作在哪個執行緒上執行
  3. 資料流式處理:可處理連續 API 請求、使用者操作等一連串非同步事件

RxJava3 常見資料類型:

  • Observable 可連續發出多筆資料,適合多次資料變化場景
  • Single 發出一筆資料或錯誤(如單一 API 請求)
  • Maybe 有可能發出資料,也可能沒有(可選資料)
  • Completable 只關心完成與否(如資料刪除成功或失敗,不需要結果)

Retrofit + RxJava3 架構組成:

1.MainActivity:

// 排程器與觀察者
import io.reactivex.rxjava3.schedulers.Schedulers;              // 背景執行緒
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; // 主執行緒(UI)
import io.reactivex.rxjava3.observers.DisposableObserver;        // 觀察資料變化

2.GetApi:

定義 Retrofit API 方法,只定義 API 的結構(如 GET、POST、參數等)。

import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface GetApi {
    @GET("F-C0032-001")
    Observable<WeatherResponse> getWeather(@Query("Authorization") String apiKey);
}

3.ApiClient:

負責設定 Retrofit,例如 base URL、資料轉換器(Gson)、攔截器(Interceptors)等等。

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory;

// 建立 Retrofit 實例,設定 baseUrl 和 JSON 轉換器並用於呼叫氣象 API
public Retrofit myWeatherApi() {
    return new Retrofit.Builder()
        // 設定 API 的根網址 (base URL),所有的接口請求會以此為基準
        .baseUrl("https://opendata.cwa.gov.tw/api/v1/rest/datastore/")
        // 設定 JSON 解析器,將回傳的 JSON 自動轉成 Java 物件
        //如果沒加這行,API 回傳 JSON 時,Retrofit 會不知道怎麼解析它,導致出現錯誤或拿到空資料。
        //註冊資料解析方式(JSON ⇄ Java)(使用 Gson 來處理 JSON)
        .addConverterFactory(GsonConverterFactory.create())
        // 配合 RxJava3 進行非同步呼叫,提供 Observable 等功能
        //讓 Retrofit 的 API 方法能回傳 RxJava3 的 Observable、Flowable 等可觀察物件
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
        // 建立 Retrofit 實例
        .build();
}

設定檔相關:

1.AndroidManifest:

<!-- 網路權限 -->
<uses-permission android:name="android.permission.INTERNET" />

2.build.gradle (module:app):

dependencies {
	// Retrofit 2
   	implementation 'com.squareup.retrofit2:retrofit:2.9.0'
   	implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
	// RxJava3 + Retrofit
  	implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
   	implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
}

補充:

在呼叫寫在ApiClint的函數時可使用以下程式碼控制其執行緒

.subscribeOn(Schedulers.io())  // 在背景執行緒進行網路呼叫 (資料來源要在哪個(io/背景)執行緒執行)
.observeOn(AndroidSchedulers.mainThread())  // 回到主執行緒更新 UI 接收資料時的執行緒observeOn( Android 的主執行緒(UI 執行緒))

上一篇
Day 22.Retrofit
下一篇
Day 24.MVP架構
系列文
Android 新手的 30 天進化論:從初學者到小專案開發者24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言