首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Retrofit 結合 RxJava 實戰指南

     編輯:Java 綜合教學

Retrofit 結合 RxJava 實戰指南

Retrofit 2.x 作為類型安全的 HTTP 客戶端,配合 RxJava 的響應式流,能優雅處理異步網絡請求、線程調度與數據轉換。本文以百度城市信息 API 為例,演示從依賴配置到完整調用的全流程。

1. 依賴準備 (Gradle)

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'
}

2. 定義數據模型

public class City {
    private String cityName, provinceName, cityCode, zipCode, telAreaCode;
    // 構造函數、getter/setter 省略
}

3. 定義 API 接口

public interface CityApi {
    @GET("cityinfo?")
    Observable<City> getCityInfo(@Query("cityname") String cityname);
}

4. 自定義 Gson 反序列化器

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);
    }
}

5. 構建 Retrofit 實例

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);
    }
}

6. 響應式調用與線程調度

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() { /* 完成 */ }
        });
}

7. 關鍵點總結

  • adapter-rxjava2 讓 Retrofit 直接返回 Observable;
  • 自定義 JsonDeserializer 處理非標準 JSON 結構;
  • RxJava 線程調度實現「後台請求,主線程更新 UI」;
  • 使用 DisposableObserver 便於取消訂閱防止內存洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved