reactivex.Observable 超时问题

下面代码测试可知:超时设置需要在map之后才有效,换句话说就是,超时只对超时设置之前的代码有用

复制代码
import io.reactivex.Observable;
import java.util.concurrent.TimeUnit;

public class TimeoutTest {

    public static void main(String[] args) throws InterruptedException {
        TimeoutTest test = new TimeoutTest();

        System.out.println("=== 测试超时任务 ===");
        test.testTimeout();

        System.out.println("\n=== 测试正常任务 ===");
        test.testNormal();

        System.out.println("\n=== 测试长任务 ===");
        test.testLongTask();

        // 确保主线程不退出
        Thread.sleep(5000);
    }

    // 测试超时任务
    public void testTimeout() {
            Observable.create(emitter -> {
                        System.out.println("超时任务模拟:执行开始...");
//                        Thread.sleep(2000); // 模拟超长时间任务(超过1秒)
                        emitter.onNext("任务完成");
                        emitter.onComplete();
                    })
                    .map(s->{
                            Thread.sleep(4000); // 模拟超长时间任务(超过1秒)
                            System.out.println("处理s0!");
                        return s + "x";
                    })
                    .timeout(3, TimeUnit.SECONDS) // 设置超时时间为1秒
                    .onErrorResumeNext(throwable -> {
                        if (throwable instanceof java.util.concurrent.TimeoutException) {
                            System.out.println("任务处理超时:跳过当前任务!");
                        } else {
                            System.err.println("任务发生其他异常:" + throwable.getMessage());
                        }
                        return Observable.empty(); // 返回空的Observable,继续处理其他任务
                    })
                    .subscribe(
                            result -> System.out.println("结果: " + result),
                            throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                            () -> System.out.println("任务已完成")
                    );

    }

    // 测试正常任务
    public void testNormal() {
        Observable.create(emitter -> {
                    System.out.println("正常任务模拟:执行开始...");
                    Thread.sleep(500); // 模拟快速任务(小于1秒)
                    emitter.onNext("任务完成");
                    emitter.onComplete();
                })
                .timeout(1, TimeUnit.SECONDS) // 设置超时时间为1秒
                .onErrorResumeNext(throwable -> {
                    System.err.println("任务超时或其他异常:" + throwable.getMessage());
                    return Observable.empty();
                })
                .subscribe(
                        result -> System.out.println("结果: " + result),
                        throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                        () -> System.out.println("任务已完成")
                );
    }

    // 测试长时间任务
    public void testLongTask() {
        Observable.create(emitter -> {
                    System.out.println("长时间任务模拟:执行开始...");
                    for (int i = 0; i < 5; i++) {
                        System.out.println("任务进行中: Step " + (i + 1));
                        Thread.sleep(600); // 模拟分段任务,每次处理600ms
                        emitter.onNext("Step " + (i + 1));
                    }
                    emitter.onComplete();
                })
                .timeout(1, TimeUnit.SECONDS) // 设置超时时间为1秒
                .onErrorResumeNext(throwable -> {
                    if (throwable instanceof java.util.concurrent.TimeoutException) {
                        System.out.println("任务处理超时:跳过当前任务!");
                    } else {
                        System.err.println("任务发生其他异常:" + throwable.getMessage());
                    }
                    return Observable.empty(); // 返回空的Observable,继续处理其他任务
                })
                .subscribe(
                        result -> System.out.println("结果: " + result),
                        throwable -> System.err.println("订阅时异常: " + throwable.getMessage()),
                        () -> System.out.println("任务已完成")
                );
    }
}
相关推荐
刘龙超7 小时前
如何应对 Android 面试官 -> 玩转 RxJava (基础使用)
android·rxjava
安卓开发者5 天前
Android中使用RxJava实现网络请求与缓存策略
android·网络·rxjava
zzywxc7876 天前
AI 行业应用:金融、医疗、教育、制造业领域的落地案例与技术实现
android·前端·人工智能·chrome·金融·rxjava
安卓开发者7 天前
驾驭复杂表单:用 RxJava 实现响应式表单处理
android·rxjava
安卓开发者8 天前
Android中RxJava与LiveData的结合使用
android·echarts·rxjava
安卓开发者10 天前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
安卓开发者12 天前
RxJava 核心概念解析:构建响应式Android应用的基石
android·echarts·rxjava
M00668820 天前
低代码系统的技术深度:超越“可视化操作”的架构与实现挑战
android·rxjava
安卓开发者1 个月前
OkHttp 与 RxJava/RxAndroid 完美结合:构建响应式网络请求架构
okhttp·架构·rxjava
liosen1 个月前
【安卓笔记】RxJava的Hook机制,整体拦截器
android·rxjava·hook