RxJava并发请求记录
发布日期:2021-05-18 09:00:19 浏览次数:18 分类:精选文章

本文共 4258 字,大约阅读时间需要 14 分钟。

RxJava并发操作实践测试

感谢阅读这篇关于RxJava并发操作的实践测试文章。本文将通过实际的代码示例,测试merge()、zip()以及concat()方法的行为。

测试背景

RxJava是一款流式编程框架,处理异步操作和并发任务非常高效。在并发领域,涉及的概念有subscribeOn()observeOn()merge()concat()zip()等。本文将重点测试merge()zip()以及concat()这几个常用的并发操作方法。

方法测试

Observables初始化

首先创建两个基于RxJava的Observable,分别用于测试不同的并发操作。

private List
> initObservables() {
List
> observables = new ArrayList<>();
// 创建第一个观察者,用于测试并发操作
Observable
obs1 = Observable.create(new ObservableOnSubscribe<>((emitter) -> {
try {
Log.e(TAG, "observable1:" + Thread.currentThread().getName());
Thread.sleep(5000);
emitter.onNext("obs1");
emitter.onComplete();
} catch (Exception e) {
Log.e(TAG, "observable1 error:" + e.getMessage());
emitter.onError(e);
}
}).subscribeOn(Schedulers.newThread());
// 创建第二个观察者,用于测试并发操作
Observable
obs2 = Observable.create(new ObservableOnSubscribe<>((emitter) -> { try { Log.e(TAG, "observable2:" + Thread.currentThread().getName()); Thread.sleep(10000); emitter.onNext("obs2"); emitter.onComplete(); } catch (Exception e) { Log.e(TAG, "observable2 error:" + e.getMessage()); emitter.onError(e); } }).subscribeOn(Schedulers.newThread()); observables.add(obs1); observables.add(obs2); return observables; }

merge() 测试

merge()方法用于将多个有序的可观察对象合并成一个,同时保持它们的顺序。大致逻辑是:将两个以上的可观察对象合并成一个,依次处理每个可观察的结果。

private void rxMerge() {
Observable.merge(initObservables())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer
() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(String s) {
Log.e(TAG, "onNext:" + s);
}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}

zip() 测试

zip()方法用于将多个有序的可观察对象中的每个操作的结果,通过一个BiFunction合并成一个结果。它适用于需要同时依赖多个操作的场景。

private void rxZip() {
List
> observables = initObservables();
Observable.zip(
observables.get(0),
observables.get(1),
new BiFunction
() {
@Override
public String apply(@NonNull String s, @NonNull String s2) throws Exception {
return s + s2;
}
}
)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer
() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(String s) {
Log.e(TAG, "onNext:" + s);
}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}

concat() 测试

concat()方法用于在断序的多个有序可观察对象之间插入连接操作,返回一个有序的新可观察对象。它不会并行执行,必须依次等待每个可观察完成后才能继续。

private void rxConcat() {
Observable.concat(initObservables())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer
() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onNext(String s) {
Log.e(TAG, "onNext:" + s);
}
@Override
public void onError(Throwable e) {}
@Override
public void onComplete() {}
});
}

实验分析

  • merge() 可以并发执行

    merge()方法会将所有指定的可观察对象依次运行,并将结果按到达顺序进行排列。查看日志可知,两个观察者分别在不同的线程执行,确保了并发执行的效果。

  • zip() 可以并发执行

    zip()方法允许所有参与合并的可观察对象同时执行,最终在BiFunction中对结果进行处理。日志显示,两个观察者在不同的线程上运行,并等待所有结果完成后再进行合并。

  • concat() 无法并发执行

    concat()方法强制依次执行每个可观察对象,直到完成后才会继续后续操作。此时日志不会显示并发的迹象,表明该方法只允许串行执行。

  • 使用场景

  • merge() 可用于多个异步任务的结果合并,适合需要先完成后展示的场景。
  • zip() 可用于多个异步任务的结果同时处理,适合需要同时依赖多个资源的场景。
  • concat() 适用于需要依次处理的任务,确保每个步骤完成后才会继续下一个步骤。
  • 注意事项

    • 使用subscribeOn()指定不同的线程,确保了观察者在不同线程运行。
    • 使用observeOn()指定结果处理的线程。
    • 避免在subscribeobserveOn指定相同的线程,否则可能造成逻辑阻塞。
    • 在大量数据或复杂操作中,确保合理分配线程和资源。
    上一篇:Androrid O+开启Service问题记录
    下一篇:解决GlideApp无法生成问题

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年05月11日 22时11分46秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了 2025-03-30
    2025版最新网络安全入门书籍整理大全,零基础入门到精通,收藏这篇就够了 2025-03-30
    2025版最新网络安全知识入门及学习流程(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-30
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了 2025-03-30
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了 2025-03-30
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了 2025-03-30
    2025版网络工程11个高含金量证书(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-30
    2025自学成为黑客必读的5本书籍,带你从小白进阶成大佬 2025-03-30
    20万高薪专业-网络安全(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-30
    23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了? 2025-03-30
    24 WEB漏洞-文件上传之WAF绕过及安全修复_阿里云盾waf绕过怎么修复 2025-03-30
    #12 btrfs文件系统 2025-03-30
    #3194. 去月球 2025-03-30
    24.线程 2025-03-30
    #Leetcode# 28. Implement strStr() 2025-03-30
    2022年课时四Servlet 中常用<Servlet>常用对象 2025-03-30
    $route 和 $router详解、区别、示例代码 2025-03-30
    $scope angular在controller之外调用 2025-03-30
    &和&&的区别 2025-03-30
    (215:断言失败)函数‘;DFT‘中的type==CV_32FC1||type==CV_32FC2||type==CV_64FC1||type==CV_64FC2; 2025-03-30