AndroidRX - 在后台运行方法

pan*_*cuh 7 android android-asynctask rx-java

我使用infinity progres bar创建了简单的活动,并且我试图使用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);

}
Run Code Online (Sandbox Code Playgroud)

vov*_*ost 19

在RxJava2中,一个可能的解决方案是:

带lambda的版本:

Single.fromCallable(() -> loadInBackground())
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe((myObject) -> { updateUi(myObject) });
Run Code Online (Sandbox Code Playgroud)

没有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);
    }
});
Run Code Online (Sandbox Code Playgroud)

示例方法:

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

private void updateUi(Object myObject) {
    // update your Views here
}
Run Code Online (Sandbox Code Playgroud)


jai*_*yta 10

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

 Single.fromCallable {
                  // method that run in background

          }
           .subscribeOn(Schedulers.io())
           .observeOn(AndroidSchedulers.mainThread())
           .subscribe()
Run Code Online (Sandbox Code Playgroud)


krp*_*krp 9

你的doHeavyStuff()在调用线程上执行计算,你只需将结果包装到Observable中.为了将计算包装成可观察的,你应该使用延迟

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

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


Mik*_*eps 9

根据文件

不推荐使用: 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) {

                    }
                });
Run Code Online (Sandbox Code Playgroud)