AndroidRX - 在后台运行方法

时间:2015-07-19 07:12:45

标签: android android-asynctask rx-java

我使用infinity progres bar创建了简单的活动,并且我尝试使用RxJava运行耗时的方法来阻止UI线程阻塞,但每次阻止UI线程。我认为我的解决方案在发射Observable方面存在问题。谁能帮我?我是RX的先生。

COME001
COMT000
COM#004
COM#006
COMT001
COMH000

5 个答案:

答案 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())