java - RxJava - 何时将 Observable 与创建方法一起使用

标签 java multithreading rx-java reactive-programming

我正在阅读教程:

http://code.tutsplus.com/tutorials/getting-started-with-reactivex-on-android--cms-24387

特别关注 RxAndroid,但它与 RxJava 几乎相同。我不确定我是否完全理解了这个概念。

下面我写了一个方法,然后是一个示例用法。

我的问题是:这是实现我的功能的正确方法吗,以便我可以在其他线程上异步运行它们?他们实际上只会返回一个创建的 Observable,运行真实的代码,并处理错误和所有这些东西。

或者这是错误的,那我想知道正确的方法。

Observable<String> googleSomething(String text){
    return Observable.create(new Observable(){
        @Override
        public void call(Subscriber<? super String> subscriber) {
             try {
                String data = fetchData(text); // some normal method
                subscriber.onNext(data); // Emit the contents of the URL
                subscriber.onCompleted(); // Nothing more to emit
            } catch(Exception e) {
                subscriber.onError(e); // In case there are network errors
            }
        }
    });
}

googleSomething("hello world").subscribeOn(Schedulers.io()).observeOn(Schedulers.immediate()).subscribe(...)

是否还使用了 Schedulers.immediate() 以便在当前线程上执行订阅者代码?它说“创建并返回一个在当前线程上立即执行工作的调度程序。”在 javadoc 中,但我不确定。

最佳答案

除非您更有经验并且需要自定义运算符或想要桥接基于遗留 addListener/removeListener 的 API,否则您不应该从 create 开始。 StackOverflow 上有几个问题使用了 create 并且是问题的根源。

我更喜欢 fromCallable,它让您生成单个值或抛出异常,因此不需要那些冗长的 defer + just 来源.

Schedulers.immediate() 立即在调用者的线程上执行其任务,在您的示例中是 io() 线程,而不是主线程。目前,不支持将计算移回 Java 主线程,因为它需要阻塞 trampolining,这通常是个坏主意。

关于java - RxJava - 何时将 Observable 与创建方法一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165189/

相关文章:

调用 JFrame 类时 Java 程序不会暂停等待用户输入

java - 德尔福: Constructing Abstract Class like Java

c - 有没有办法找到当前 pthread 持有的 pthread_mutexes 列表?

java - 在循环内创建线程的正确性

java - rxJava如何让flatMap在多线程上运行

android - 将 RxJava 与 Room 一起使用时循环

java - 在将 fragment 添加到 Activity 之前为 fragment 膨胀 View

java - NoClassDefFound错误: org/apache/lucene/analysis/util/CharArraySet

Java多线程系统

java - 使用 RxJava 执行并行任务并等待其中最后一个任务完成