正确使用Observable(RxJava)

时间:2016-05-10 22:08:05

标签: android android-asynctask rx-java observable rx-android

我已使用RxJava + Retrofit + EventBus。它很棒!

但我不完全明白如何使用Rx Observable作为简单的AsyncTask

我会解释一下:

例如,我有一个方法,我想在后台(而不是在UI线程中):

    public void teachMe() {
      for(int i=0;i< daysUntilGenius;i++){
            Log.e("WORK DAY" , String.valueOf(i));
          }
    }

当这个方法完成后,我想切换到主线程并显示吐司或其他东西。

使用AsynсTask我可以使用方法doInBackgroundonPostExecute来完成,但我想使用Rx ObservableSubscriber来完成。 我alredy使用Schedulers,所以我知道如何在线程之间切换,我只是不知道如何将我的所有这些放在一起并使其工作!

我需要和示例或代码片段稍微解释一下,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

public void doAsyncStuff(int days) {
    Observable
        .just(days)
        .subscribeOn(Schedulers.newThread())
        .doOnEach(n -> teachMe(n))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(n -> Log.i("Completed " + n));
}

public void teachMe(int daysUntilGenius) {
    for(int i = 0; i < daysUntilGenius; i++){
        Log.e("WORK DAY", String.valueOf(i));
    }
}

答案 1 :(得分:0)

最终我找到了解决方案:

public Subscription test(final int days){
    return Observable.create(new Observable.OnSubscribe<Void>() {
        @Override
        public void call(Subscriber<? super Void> subscriber) {
            teachMe(days);
            subscriber.onCompleted();
        }

    })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Void>() {
                @Override
                public void onCompleted() {
                    Toast.makeText(MainActivity.this.getApplicationContext(),"COMPLETE",Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(Void aVoid) {
                }
            });
}


public void teachMe(int days) {
  for(int i=0;i< daysUntilGenius;i++){
        Log.e("WORK DAY" , String.valueOf(i));
      }
}