// 排程器與觀察者
import io.reactivex.rxjava3.schedulers.Schedulers; // 背景執行緒
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; // 主執行緒(UI)
import io.reactivex.rxjava3.observers.DisposableObserver; // 觀察資料變化
定義 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);
}
負責設定 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();
}
<!-- 網路權限 -->
<uses-permission android:name="android.permission.INTERNET" />
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 執行緒))