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

sir*_*von 6 android reactive-programming rx-java rx-android

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

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

该对象的所有函数都需要在后台线程上运行.获取,放置,清除和删除.

 String city = Paper.get("city");
Run Code Online (Sandbox Code Playgroud)

njz*_*zk2 5

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个基本的例子.现在,你想要包装它,这样你就可以调用任何函数,而不仅仅是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"));
Run Code Online (Sandbox Code Playgroud)

(如果你想知道,这是由retrolambda带到android的java8 lambdas.非常好的删除Rx的冗长)

一旦你有了observable,你可以订阅它,并获得结果.要在后台执行,并在ui线程上检索结果,您可以:

 res.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
Run Code Online (Sandbox Code Playgroud)

AndroidSchedulers由...提供rx-android.

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

.subscribe(city -> Log.d(TAG, city));
Run Code Online (Sandbox Code Playgroud)

这会返回订阅,如果您需要取消它,这将非常有用.

总体:

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

  • 对于其他感兴趣的人__OperatorFromFunctionals__包含在这个dep中https://github.com/ReactiveX/RxJavaAsyncUtil __compile'io.reactivex:rxjava-async-util:0.21.0'__ (2认同)