我使用infinity progres bar创建了简单的活动,并且我尝试使用RxJava运行耗时的方法来阻止UI线程阻塞,但每次阻止UI线程。我认为我的解决方案在发射Observable方面存在问题。谁能帮我?我是RX的先生。
COME001
COMT000
COM#004
COM#006
COMT001
COMH000
答案 0 :(得分:14)
在RxJava2中,一个可能的解决方案是:
lambdas版本:
Single.fromCallable(() -> loadInBackground())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((myObject) -> { updateUi(myObject) });
没有lambdas的版本:
Single.fromCallable(new Callable<Object>() {
@Override
public Object call() throws Exception {
return loadInBackground();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object myObject) throws Exception {
updateUi(myObject);
}
});
示例方法:
private Object loadInBackground() {
// some heavy load code
return myObject;
}
private void updateUi(Object myObject) {
// update your Views here
}
答案 1 :(得分:9)
你的doHeavyStuff()在调用线程上执行计算,你只需将结果包装到Observable中。 为了将计算包装成observable,您应该使用 defer
Observable.defer(new Func0<Observable<Integer>>() {
@Override
public Observable<Integer> call() {
return Observable.just(doHeavyStuff());
}
});
然后你可以通过 subscribeOn 和 observeOn 方法指定线程
答案 2 :(得分:9)
根据docs
推荐使用: 的 fromFunc0 强> 现在不需要Func0扩展Callable。只需调用fromCallable(java.util.concurrent.Callable)。
所以你可以用这种方式打电话:
Observable.fromCallable(new Callable<Object>() {
@Override
public Object call() throws Exception {
return someMethod();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Object>() {
@Override
public void call(Object object) {
}
});
答案 3 :(得分:3)
kotlin使用以下代码在后台工作
Single.fromCallable {
// method that run in background
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
答案 4 :(得分:1)
此外,您可以使用RxJavaAsyncUtil:
compile 'io.reactivex:rxjava-async-util:0.21.0'
代码:
Observable.fromFunc0(() -> doHeavyStuff())