如何在Android RxJava中用flatMap无Lambda函数顺序调用三次网络服务接口
在Android RxJava中使用flatMap无Lambda依次调用三次网络接口
嘿,我来给你一步步拆解怎么实现这个需求,完全不用Lambda函数,用RxJava的flatMap操作符链式调用三次网络接口。首先得确认你的基础配置已经到位——你提供的ApiClient已经配置了Retrofit和RxJava的适配器,这部分没问题,那我们先把接口定义补全,再写核心的调用逻辑。
第一步:完善接口定义(ApiInterface)
首先我们需要三个可以依次调用的接口,这里假设第一个接口返回文章列表,第二个根据文章ID拿详情,第三个根据详情里的作者ID拿作者信息,刚好能体现flatMap传递参数的作用:
public interface ApiInterface { // 1. 获取政治分类最新文章列表 @GET("posts/category/politics/recent") Observable<List<Post>> getRecentPoliticalPosts(); // 2. 根据文章ID获取文章详情 @GET("posts/{postId}") Observable<PostDetail> getPostDetail(@Path("postId") String postId); // 3. 根据作者ID获取作者信息 @GET("authors/{authorId}") Observable<Author> getAuthorInfo(@Path("authorId") String authorId); }
(注:这里的Post、PostDetail、Author是你需要自己定义的实体类,对应接口返回的JSON结构即可)
第二步:核心调用逻辑(无Lambda实现)
接下来就是用flatMap链式调用这三个接口,全程用匿名内部类替代Lambda,代码逻辑清晰易懂:
// 先拿到ApiInterface实例 ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class); // 链式调用开始 apiService.getRecentPoliticalPosts() // 第一次flatMap:把文章列表Observable转成文章详情Observable .flatMap(new Function<List<Post>, ObservableSource<PostDetail>>() { @Override public ObservableSource<PostDetail> apply(List<Post> posts) throws Exception { // 处理第一个接口的返回值,取第一篇文章的ID if (posts != null && !posts.isEmpty()) { String firstPostId = posts.get(0).getId(); // 调用第二个接口 return apiService.getPostDetail(firstPostId); } else { // 如果没拿到数据,返回错误Observable终止流程 return Observable.error(new Throwable("没有获取到文章列表")); } } }) // 第二次flatMap:把文章详情Observable转成作者信息Observable .flatMap(new Function<PostDetail, ObservableSource<Author>>() { @Override public ObservableSource<Author> apply(PostDetail postDetail) throws Exception { // 从文章详情里拿作者ID String authorId = postDetail.getAuthorId(); if (authorId != null && !authorId.isEmpty()) { // 调用第三个接口 return apiService.getAuthorInfo(authorId); } else { return Observable.error(new Throwable("未找到作者ID")); } } }) // 指定网络请求在IO线程执行,避免阻塞主线程 .subscribeOn(Schedulers.io()) // 指定结果回调在主线程,方便更新UI .observeOn(AndroidSchedulers.mainThread()) // 订阅结果,处理成功、错误等情况 .subscribe(new Observer<Author>() { @Override public void onSubscribe(Disposable d) { // 这里可以保存Disposable,后续需要取消订阅时用(比如页面销毁) } @Override public void onNext(Author author) { // 最终拿到作者信息,在这里处理UI更新,比如显示作者名字 Log.d("RxJavaDemo", "作者名字:" + author.getName()); } @Override public void onError(Throwable e) { // 任何一步出错都会走到这里,统一处理错误,比如弹出提示 Log.e("RxJavaDemo", "请求出错:" + e.getMessage()); } @Override public void onComplete() { // 所有请求都完成时的回调,比如显示加载完成状态 Log.d("RxJavaDemo", "三次网络请求全部完成"); } });
关键细节说明
- flatMap的作用:它能把上一个Observable的输出转换成新的Observable,这样就能实现链式的异步调用,而且每一步都能拿到前一步的结果作为参数。
- 线程调度:
subscribeOn(Schedulers.io())让所有网络请求在IO线程跑,不会卡主线程;observeOn(AndroidSchedulers.mainThread())让结果回调回到主线程,方便更新UI。 - 异常处理:每一步都做了空值判断,一旦出现异常就返回
Observable.error(),后续流程会直接走到onError方法,避免空指针崩溃。
必要依赖提醒
别忘了在你的build.gradle里添加这些依赖,不然代码跑不起来:
implementation 'io.reactivex.rxjava2:rxjava:2.2.21' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
内容的提问来源于stack exchange,提问作者user2416657
相关产品推荐
相关产品推荐

