AndroidRX - 运行 后台方法

AndroidRX - run method in background

我创建了带有无限进度条的简单 activity,我正在尝试使用 RxJava 运行 耗时的方法来防止 UI 线程阻塞,但每次 UI 线程被阻塞。我认为我的解决方案在发射 Observable 方面存在问题。谁能帮我?我是 RX 的初学者。

public class MainActivity extends AppCompatActivity {

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

public void doSomething(View view) {
    doHeavyStuff()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(new Action1() {
                @Override
                public void call(Object o) {
                    Toast.makeText(getApplicationContext(), "FINISHED", Toast.LENGTH_SHORT).show();
                }
            })
            .subscribe();
}

private Observable doHeavyStuff() {
    for (int i = 0; i < 999999999; i++) {
        for (int j = 0; j < 2; j++) {
        }
    }
    return Observable.just(1);

}

您的 doHeavyStuff() 在调用线程上执行计算,您只需将 result 包装到 Observable 中。 为了将 computation 包装成可观察的,你应该使用 defer

Observable.defer(new Func0<Observable<Integer>>() {
    @Override
    public Observable<Integer> call() {
        return Observable.just(doHeavyStuff());
    }
});

然后你可以通过subscribeOnobserveOn方法指定线程

此外,您可以使用 RxJavaAsyncUtil:

compile 'io.reactivex:rxjava-async-util:0.21.0'

代码:

Observable.fromFunc0(() -> doHeavyStuff())

根据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) {

                    }
                });

对于 RxJava2,一个可能的解决方案是:

带有 lambda 的版本:

Single.fromCallable(() -> loadInBackground())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe((resultObject) -> { updateUi(resultObject) });

没有 lambda 的版本:

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 resultObject) throws Exception {
        updateUi(resultObject);
    }
 });

上面使用的示例方法:

private Object loadInBackground() {
    // some heavy load code
    return resultObject;
}

private void updateUi(Object resultObject) {
    // update your Views here
}

kotlin 使用以下代码在后台工作

 Single.fromCallable {
                  // method that run in background

          }
           .subscribeOn(Schedulers.io())
           .observeOn(AndroidSchedulers.mainThread())
           .subscribe()