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
相关产品推荐
相关产品推荐

