当前位置: 首页 > 知识库问答 >
问题:

使用RxJava管理相同的请求

刘阳舒
2023-03-14

我如何用RxJava方法实现上面的场景?我希望利用某种现有的运算符,以声明性更强的方式组合它们,最重要的是,避免同步、锁和原子的开销。

共有1个答案

马德宇
2023-03-14

问题中的线索是:“假设我有一个提取器,它从一个独立线程上的给定链接中提取一个图像。然后图像将被缓存在内存中。”

答案是cache()运算符:

记住由可观察者发出的项目序列,并向未来的订户发出相同的序列

因此,无论订阅者如何订阅映像,以下可观察的应该只获取映像一次:

Observable<Bitmap> cachedBitmap = fetchBitmapFrom(url).cache();

编辑:

我认为下面的示例证明了上游Observable只订阅了一次,即使在Observable发出任何内容之前有多个订阅。对于网络请求也应该如此。

package com.example;

import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers;

public class SimpleCacheTest {

    public static void main(String[] args) {
        final Observable<Integer> cachedSomething = getSomething().cache();

        System.out.println("before first subscription");
        cachedSomething.subscribe(new SimpleLoggingSubscriber<Integer>("1"));

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("before second subscription");
        cachedSomething.subscribe(new SimpleLoggingSubscriber<Integer>("2"));

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("quit");
    }

    private static class SimpleLoggingSubscriber<T> extends Subscriber<T> {

        private final String tag;

        public SimpleLoggingSubscriber(final String tag) {
            this.tag = tag;
        }
        @Override
        public void onCompleted() {
            System.out.println("onCompleted (" + tag + ")");
        }

        @Override
        public void onError(Throwable e) {
            System.out.println("onError (" + tag + ")");
        }

        @Override
        public void onNext(T t) {
            System.out.println("onNext (" + tag + "): " + t);
        }
    }

    private static Observable<Integer> getSomething() {
        return Observable.create(new Observable.OnSubscribe<Integer>(){

            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                System.out.println("going to sleep now...");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                subscriber.onNext(1);
                subscriber.onCompleted();
            }
        }).subscribeOn(Schedulers.io());
    }
}
before first subscription
going to sleep now...
before second subscription
onNext (1): 1
onNext (2): 1
onCompleted (1)
onCompleted (2)
quit
 类似资料:
  • 我有一个Java web应用程序,使用SPRING进行REST调用。 我想控制应用程序为请求打开的线程数。 所以我添加了线程配置: 我使用的同步服务不是异步的,我对它进行了测试,它没有限制处理请求的线程,而是同时处理所有请求。 我所期望的是,当我一次发送两个请求时,要么抛出第二个请求,要么等待第一个请求完成。 我根本没有在我的应用程序中实现Thread。这是我的控制器的相关代码: 这是控制台结果:

  • 相册管理 一、相册管理:指对所有上传的图片的归类管理。 1、创建相册:可以新建多个相册。 2、上传图片:可以上传图片到相册里。 3、搜索:输入相册名称对相册的搜索。 二、点击相册进入可看到对图片的修改及其他功能。 1、替换上传:指把现在的图片替换成其他图片。 2、转移相册:指把现在的图片转移到其他相册。 3、设为封面:把现在所选图片设置成相册的封面展示。 4、删除图片:删除现在所选图片。 5、复制

  • 问题内容: 我在Android应用程序上使用Retrofit + RxJava,并问自己如何处理API分页以链接调用,直到检索到所有数据。是这样的: 所述ApiResponse对象具有简单的结构: API将返回下一个值,直到最后一页。 有一些好的方法可以做到这一点吗?试图结合一些flatMaps(),但没有成功。 问题答案: 您可以递归建模: 然后,要消耗它, 那应该使您有一个流ResponseO

  • 我有一个任务列表,它们之间有依赖关系,我正在考虑如何使用JGraphT来管理任务的顺序。我会将图形设置为有向图,并在处理顶点时删除顶点(或者我应该屏蔽它们吗?如果我一次只执行一个任务,我可以使用,但我希望并行化这些任务。我可以获取并检查直到我找到尽可能多的我想要执行一次,但理想情况下,会有像这样的东西。我看到Netflix提供了一个获取叶顶点的实用程序,所以我可以反转图形并使用它,但它可能不值得。

  • 我是RxJava新手,不知道如何使用ConnectableObservable实现可重复轮询,2个订阅者在不同的线程上处理事件。 我有一条大致如下的管道: 我想以类似于解决方案的方式在延迟后重复整个管道https://github.com/ReactiveX/RxJava/issues/448 或带有repeatWhen()的动态延迟值。 这在普通(不可连接)可观察的情况下可以正常工作,但在多播情

  • 我想在GTM中跟踪表格CTA确认。有两种形式,网址是相同的,CTA是相同的,但我想收集这两个CTA在不同的事件。我做了一个GTM触发器:当单击ID=我的CTA时,我收集信息“当用户单击该CTA时,发送了一个事件”,但是我想收集这些信息,基于我的表单版本,这只在两个方面有所不同的网站:-在这里是唯一的-在脚本: 如何在GTM中考虑触发器:当CTA ID=XXX和我的“TraceNeNe= 1”触发一