RxJava 队列多个可观察对象

3

我有许多Observable方法。我希望在前一个完成后运行下一个。

A类

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

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

乙类

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

我希望按顺序运行它...最难的是:我不能改变Class B。我必须改变Class A才能实现我的目标。有什么想法吗?
我可以在Class B中使用flatMat(...)或concatMap(...)来完成,但我不能改变Class B。

我想要在前一个完成后运行下一个。这句话的意思是什么? - Michael
也许我在这里理解有误,但是你的需求“翻译”成了某种程度上与整个 RxJava Observable 概念相矛盾的东西,这是怎么回事呢?当你依赖于按顺序完成任务时,异步/无序执行任务的意义何在呢? - GhostCat
@GhostCat 不是。method1()method2()是由按钮点击调用的。此外,这些方法正在编辑相同的数据。如果method1()执行特定操作(数据库更改),那么method2()可能会执行不同的操作。 - Lau
虽然这个需求的背景不是很清楚,但是创建新方法以按照所需顺序执行并通过 method1、method2 等调用它们难道不是很简单吗?我无法理解如果 method1 和 method2 是由按钮点击调用的,为什么我们希望在某人点击 button2 时先执行 method1,然后再执行 method2。 - Pavan Kumar
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lau
1个回答

0

看起来很糟糕,但应该能够完成任务。Semaphore会确保只有一个线程在处理数据。请注意,此解决方案不能保证操作的顺序。

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();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接