我如何使用 RxJava 运行 这个语句?
How would I run this statement using RxJava?
Rx 做事的方式对于 none 来说可能非常复杂,原因有很多...
但我觉得有一些简单的方法可以用 RX 做一些简单的事情...
我如何简单地在后台线程上执行此语句并在 ui 线程上接收响应?
此对象的所有函数都需要在后台线程上运行。获取、放置、清除和删除。
String city = Paper.get("city");
Rx 中的基础对象是 Observable
。该对象通常包装一个 OnSubscribe
对象,它只是 Action1
的扩展,以 Subscriber
作为参数。
这意味着您只需要定义一个 class 来包装您的调用并将结果传递给 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"));
(如果你想知道,这是 java8 lambda 由 retrolambda 带到 android。quite 很好地删除了 Rx 的冗长)
获得可观察对象后,您可以订阅它并获得结果。要在后台执行,并在 ui 线程上检索结果,您可以这样做:
res.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
AndroidSchedulers
由 rx-android
提供。
然后你可以简单地用结果回调:
.subscribe(city -> Log.d(TAG, city));
那个 returns 订阅,如果您需要取消订阅,这很有用。
总体:
OperatorFromFunctionals.fromCallable(() -> Paper.get("city"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(city -> Log.d(TAG, city));
编辑:这是不正确的。虽然为了保留评论,但不会删除答案。
非常简单的例子:
@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()
是 运行 长运算,returns 是 String
。检查 docs for Scheduler。
如果你想在收到你的操作结果后改变UI,不要忘记在主线程上观察,否则你会得到一个从外部改变UI的异常UI 线程。
Rx 做事的方式对于 none 来说可能非常复杂,原因有很多... 但我觉得有一些简单的方法可以用 RX 做一些简单的事情...
我如何简单地在后台线程上执行此语句并在 ui 线程上接收响应?
此对象的所有函数都需要在后台线程上运行。获取、放置、清除和删除。
String city = Paper.get("city");
Rx 中的基础对象是 Observable
。该对象通常包装一个 OnSubscribe
对象,它只是 Action1
的扩展,以 Subscriber
作为参数。
这意味着您只需要定义一个 class 来包装您的调用并将结果传递给 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"));
(如果你想知道,这是 java8 lambda 由 retrolambda 带到 android。quite 很好地删除了 Rx 的冗长)
获得可观察对象后,您可以订阅它并获得结果。要在后台执行,并在 ui 线程上检索结果,您可以这样做:
res.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
AndroidSchedulers
由 rx-android
提供。
然后你可以简单地用结果回调:
.subscribe(city -> Log.d(TAG, city));
那个 returns 订阅,如果您需要取消订阅,这很有用。
总体:
OperatorFromFunctionals.fromCallable(() -> Paper.get("city"))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(city -> Log.d(TAG, city));
编辑:这是不正确的。虽然为了保留评论,但不会删除答案。
非常简单的例子:
@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()
是 运行 长运算,returns 是 String
。检查 docs for Scheduler。
如果你想在收到你的操作结果后改变UI,不要忘记在主线程上观察,否则你会得到一个从外部改变UI的异常UI 线程。