Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
155 views
in Technique[技术] by (71.8m points)

android - AndroidRX-后台运行方法(AndroidRX - run method in background)

I created simple activity with infinity progres bar, and I'am trying to run time consuming method using RxJava to prevent UI thread from blocking, but everytime UI thread is blocked.

(我使用无穷进度栏创建了简单的活动,并且尝试使用RxJava运行耗时的方法来防止UI线程被阻塞,但是每次UI线程都被阻塞。)

I think my solution has problem with emitting Observable.

(我认为我的解决方案存在发射Observable的问题。)

Can anyone help me?

(谁能帮我?)

I'am begginer in RX.

(我是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);

}
  ask by panbacuh translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

With RxJava2 a possible solution is:

(使用RxJava2,可能的解决方案是:)

Version with lambdas: (带有lambda的版本:)

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

Version without lambdas: (没有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);
    }
 });

Example methods used above: (上面使用的示例方法:)

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

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...