【问题标题】:RxJava queue multi observablesRxJava 队列多可观察对象
【发布时间】:2017-01-09 10:19:44
【问题描述】:

我有很多 Observable 方法。我想在之前的完成后运行下一个。

A 类

public Observable<String> method1(){
    // complex stuff (10 sec)
}

public Observable<String> method2(){
    // another complex stuff (10 sec)
}

B 类

foo.method1().subscribe(...);
foo.method2().subscribe(...);
foo.method1().subscribe(...);
foo.method1().subscribe(...);

我想一个接一个地运行它...最难的一个:我无法更改B类。我必须改变A类来实现我的目标。有什么想法吗?

我可以使用flatMat(...)concatMap(...)B 类 中做到这一点,但我无法更改B 类

【问题讨论】:

  • "我想在之前的完成后运行下一个。"这是什么意思?
  • 也许我在这里弄错了,但是您的要求不是“翻译”成某种与整个 RxJava Observable 想法相矛盾的东西吗?当您依赖正在按顺序完成的事情时,异步/乱序做事有什么意义?
  • @GhostCat No. method1()method2() 通过按钮单击调用。此外,这些方法正在编辑相同的数据。如果method1() 进行特定操作(数据库已更改),method2() 可以做不同的事情
  • 虽然上下文对这个要求不是很清楚,但创建新方法以首选顺序执行您想要的操作并通过method1、method2等调用它们不是很简单吗?我无法理解是否通过单击按钮调用方法 1 和方法 2,当有人单击按钮 2 时,我们如何以及为什么要执行方法 1,然后执行方法 2
  • 例如。 method1() -> 从服务器获取一页信息 - 插入数据库。 method2() -> 在屏幕上显示所有信息。如果我们一个一个地做:getFirstPage -> showThisPage -> getSecPage -> getThirdPage。如您所见,如果用户第三次点击第一个按钮,那么我将第三次要求第一页。

标签: java android queue rx-java


【解决方案1】:

它看起来很糟糕,但应该可以完成这项工作。 Sempahore 将确保只有一个线程在处理数据。请注意,此解决方案不保证操作顺序。

public class  A {

    private final Semaphore semaphore = new Semaphore(1);

    public Observable<String> method1() {
        try {
            semaphore.acquire();
            // complex stuff (10 sec)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public Observable<String> method2() {
        try {
            semaphore.acquire();
            // another complex stuff (10 sec)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多