You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

接入RxJava后项目无法获取接口数据、页面不展示内容是什么原因?

问题根因

  • 缺少RxJava线程调度配置:默认情况下RxJava的Observable执行在当前订阅线程(也就是主线程),Android禁止主线程发起网络请求,会直接抛出异常,你没有捕获处理自然看不到问题
  • onError空实现导致异常被吞:原来的Call实现里onFailure会主动给LiveData设置错误状态,你现在RxJava的onError方法里没有任何逻辑,网络报错、数据解析出错的话你完全感知不到,LiveData会一直停留在loading状态,页面自然不会更新
  • 如果你没在Retrofit初始化时添加RxJava对应版本的CallAdapter,apiService返回的Observable根本不会正常发起请求,这也是常见原因

修复步骤

  1. 先确认Retrofit初始化代码已经添加了RxJava对应版本的CallAdapter,以RxJava3为例:
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("你的接口baseUrl")
    .addConverterFactory(你使用的解析工厂,比如GsonConverterFactory.create())
    // 必须加这行,才能让Retrofit支持返回Observable类型
    .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
    .build();
  1. 给Observable加上线程调度,指定网络请求在IO线程执行,结果回调到主线程
  2. 补全onError逻辑,异常时给LiveData设置错误状态
  3. 建议管理Disposable,避免ViewModel销毁时请求还在跑导致内存泄漏

修复后完整代码

public LiveData<Resource<List<Item>>> makeApiCallTopArticles() {
    final MutableLiveData<Resource<List<Item>>> mediumObjectsList = new MutableLiveData<>();
    mediumObjectsList.setValue(Resource.loading());
    APIService apiService = RetroInstant.getRetroMediumClient().create(APIService.class);
    Observable<CnnResponse> observable = apiService.getNewsObjectsList("http://rss.cnn.com/rss/cnn_topstories.rss",
            "", "25");

    Observer<CnnResponse> observer = new Observer<CnnResponse>() {
        @Override
        public void onSubscribe(Disposable d) {
            // 建议把这个Disposable实例加到ViewModel的CompositeDisposable里,ViewModel onCleared时统一 dispose 避免内存泄漏
        }

        @Override
        public void onNext(CnnResponse value) {
            List<Item> articles = new ArrayList<>();
            assert value != null;
            List<Item> responce = value.getItems();
            for (int i = 0; i < Objects.requireNonNull(responce).size(); i ++) {
                if (!Objects.equals(Objects.requireNonNull(responce.get(i).getEnclosure()).getLink(), null) && !Objects.equals(responce.get(i).getTitle(), "")) {
                    articles.add(responce.get(i));
                }
            }
            mediumObjectsList.postValue(Resource.success(articles));
        }

        @Override
        public void onError(Throwable e) {
            // 补全错误逻辑,和原来的Call实现保持一致
            mediumObjectsList.postValue(Resource.error(e.getMessage() != null ? e.getMessage() : "Unknown Error"));
        }

        @Override
        public void onComplete() {

        }
    };
    // 加上线程调度,必须配置
    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);
    return mediumObjectsList;
}

注意事项

如果是RxJava2版本,RxAndroid的依赖是implementation 'io.reactivex.rxjava2:rxandroid:2.1.1',RxJava3版本的依赖是implementation 'io.reactivex.rxjava3:rxandroid:3.0.2',不要导错包。

内容的提问来源于stack exchange,提问作者Moataz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 07:06:04