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

RxJava2条件式API调用优化:避免重复取消预约代码

用RxJava 2优雅实现带前置条件的取消课程预约功能

嘿,这个需求用RxJava的操作符就能轻松搞定,完全不用重复编写取消预约的代码!核心思路就是把重复的取消预约逻辑抽成独立的Observable,然后用RxJava的操作符串联不同流程,不管是直接取消还是先获取classId再取消,都复用同一套逻辑。

第一步:抽离通用的取消预约逻辑

首先,我们把取消预约的API调用单独封装成一个方法,这样不管什么场景下需要取消,都直接调用这个方法就行:

FitnessDataService service = RetrofitInstance.getRetrofitInstance().create(FitnessDataService.class);

// 封装通用的取消预约Observable
private Observable<Boolean> cancelAppointment(String classId) {
    return service.cancelClassAppointment(classId)
            // 根据实际API返回做统一处理,比如转换为布尔值标记成功/失败
            .map(response -> response.isSuccess())
            .onErrorReturn(throwable -> {
                // 统一处理取消过程中的错误,比如返回false或抛出自定义异常
                Log.e("CancelError", "取消预约失败", throwable);
                return false;
            });
}

第二步:处理两种场景的流程

接下来写一个入口方法,根据是否存在classId来决定执行哪条流程:

public Observable<Boolean> handleCancelAppointment(String existingClassId) {
    if (existingClassId != null && !existingClassId.isEmpty()) {
        // 已有classId,直接调用取消逻辑
        return cancelAppointment(existingClassId);
    } else {
        // 没有classId,先调用接口获取,再执行取消逻辑
        return service.getBookedClassId()
                // 获取到classId后,切换到取消预约的Observable
                .flatMap(bookedClassId -> cancelAppointment(bookedClassId))
                .onErrorReturn(throwable -> {
                    // 处理获取classId过程中的错误
                    Log.e("GetClassIdError", "获取已预约课程ID失败", throwable);
                    return false;
                });
    }
}

这样做的优势

  • 避免代码重复:取消预约的核心逻辑只写了一次,两种场景都复用该逻辑,后续修改取消逻辑只需改动这一处。
  • 流程清晰:用RxJava的flatMap完美串联“获取classId → 取消预约”的异步流程,没有嵌套回调,代码可读性拉满。
  • 灵活错误处理:既可以在封装的cancelAppointment方法里统一处理取消错误,也能在入口方法里分别处理获取classId和取消的错误,适配不同需求。

使用示例

最后只需订阅这个Observable就能完成整个流程:

handleCancelAppointment(userCurrentClassId)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(isSuccess -> {
            if (isSuccess) {
                // 取消成功后的UI操作,比如提示用户、刷新列表
                Toast.makeText(context, "预约已取消", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(context, "取消失败,请稍后重试", Toast.LENGTH_SHORT).show();
            }
        });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:28