Retrofit 2.x 作為類型安全的 HTTP 客戶端,配合 RxJava 的響應式流,能優雅處理異步網絡請求、線程調度與數據轉換。本文以百度城市信息 API 為例,演示從依賴配置到完整調用的全流程。
dependencies {
implementation 'io.reactivex.rxjava2:rxjava:2.x.x'
implementation 'io.reactivex.rxjava2:rxandroid:2.x.x'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
}
public class City {
private String cityName, provinceName, cityCode, zipCode, telAreaCode;
// 構造函數、getter/setter 省略
}
public interface CityApi {
@GET("cityinfo?")
Observable<City> getCityInfo(@Query("cityname") String cityname);
}
API 返回結構為 {errNum, retMsg, retData: {...}},需提取 retData 映射到 City。
public class CityDeserializer implements JsonDeserializer<City> {
@Override
public City deserialize(JsonElement je, Type type, JsonDeserializationContext ctx) {
JsonElement data = je.getAsJsonObject().get("retData");
return new Gson().fromJson(data, type);
}
}
public class CityService {
private static final String BASE_URL = "https://apistore.baidu.com/microservice/";
private static final Gson GSON = new GsonBuilder()
.registerTypeAdapter(City.class, new CityDeserializer())
.create();
private static final Retrofit RETROFIT = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(GSON))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
public static CityApi create() {
return RETROFIT.create(CityApi.class);
}
}
public void fetchCity(String cityName) {
CityService.create()
.getCityInfo(cityName)
.subscribeOn(Schedulers.io()) // 網絡請求在 IO 線程
.observeOn(AndroidSchedulers.mainThread()) // 結果回調在主線程
.subscribe(new DisposableObserver<City>() {
@Override public void onNext(City city) {
Log.d("CityInfo", city.getCityCode() + "--" + city.getProvinceName());
}
@Override public void onError(Throwable e) { Log.e("CityInfo", "Error", e); }
@Override public void onComplete() { /* 完成 */ }
});
}
adapter-rxjava2 讓 Retrofit 直接返回 Observable;JsonDeserializer 處理非標準 JSON 結構;DisposableObserver 便於取消訂閱防止內存洩漏。