android - 我将如何使用 RxJava 运行此语句?

标签 android reactive-programming rx-java rx-android

Rx 做事的方式可能非常复杂,原因有很多…… 但我觉得有一些简单的方法可以用 RX 做一些简单的事情......

我如何简单地在后台线程上执行此语句并在 ui 线程上接收响应?

该对象的所有功能都需要在后台线程上运行。获取、放置、清除和删除。

 String city = Paper.get("city");

最佳答案

Rx 中的基础对象是Observable。该对象通常包装一个 OnSubscribe 对象,它只是 Action1 的一个扩展,它接受一个 Subscriber 作为参数。

这意味着您只需要定义一个类来包装您的调用并将结果传递给 Subscriber:

public class RxPaperGet implements Observable.OnSubscribe<String> {
    @Override
    public void call(Subscriber<? super String> t1) {
        try {
            t1.onNext(Paper.get("city"));
        } catch (Throwable t) {
            t1.onError(t);
            return;
        }
        t1.onCompleted();
    }
}

这是一个基本的例子。现在,您可能希望包装它以便调用任何函数,而不仅仅是 Paper.get("city")。类似于 https://github.com/ReactiveX/RxJavaAsyncUtil/blob/0.x/src/main/java/rx/util/async/operators/OperatorFromFunctionals.java#L44通过允许您传递任意 Callable 来做到这一点。

在您的情况下,将实现为:

Observable<String> res = OperatorFromFunctionals.fromCallable(() -> Paper.get("city"));

(如果您想知道,这是由 retrolambda 引入 android 的 java8 lambdas。非常好,可以消除 Rx 的冗长)

一旦您有了自己的可观察对象,您就可以订阅它并获得结果。要在后台执行,并在 ui 线程上检索结果,您可以这样做:

 res.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())

AndroidSchedulersrx-android 提供。

然后你可以简单地用结果回调:

.subscribe(city -> Log.d(TAG, city));

这会返回一个订阅,如果您需要取消订阅,这会很有用。

总体:

OperatorFromFunctionals.fromCallable(() -> Paper.get("city"))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(city -> Log.d(TAG, city));

关于android - 我将如何使用 RxJava 运行此语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147914/

相关文章:

java - 如何避免通过 Android DownloadManager 下载损坏?

java - 如何在没有主题的 RX 中创建反馈循环?

java - RxJava : dynamically create Observables and send the final resut as Observable

android - 在构建过程中添加代码生成步骤的最佳方法?

Android Datepicker 对话框具有透明背景

android - 这条短信(包括áéíóúñ)可以一条短信发吗?

spring - Spring Web Flux(响应式(Reactive))功能路由与Kotlin一起无法正常工作

java - 在 Java 中链接可变数量的 Promise (CompletableFuture)

kotlin - defer() 和 defer{} 有什么区别

rx-java - share() 和 publish().autoConnect() 有什么区别?