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

时间:2015-08-21 19:23:22

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

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

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

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

<property name="jadira.usertype.autoRegisterUserTypes" value="true"/>

2 个答案:

答案 0 :(得分:5)

Rx中的基础对象是+-------------+ | col2 col3 | +-------------+ | item_1 2 | | item_2 2 | +-------------+ 。该对象通常包含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

(如果你想知道,这是由retrolambda带到android的java8 lambdas。很高兴删除Rx的冗长)

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

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

res.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) AndroidSchedulers提供。

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

rx-android

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

总体:

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

答案 1 :(得分:0)

编辑:这是不正确的。虽然保留评论,但不会删除答案。

很简单的例子:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    getPaper()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.d("xxx", s);
                }
            });


}

private Observable<String> getPaper() {

    return Observable.just(Paper.get());
}

其中Paper.get()是一个长时间运行的操作,返回String。检查docs for Scheduler

如果要在收到操作结果后更改UI,请不要忘记在主线程上观察,否则您将从UI线程外部更改UI。