【问题标题】:Proper use of Observable (RxJava)正确使用 Observable (RxJava)
【发布时间】:2016-05-10 22:08:04
【问题描述】:

我已经在使用RxJava + Retrofit + EventBus。效果很好!

但我并不完全理解如何使用 Rx Observable 和简单的 AsyncTask

我会解释一下:

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

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

当这个方法完成时,我想切换到主线程并显示 toast 或其他内容。

使用 AsynсTask 我可以简单地使用方法 doInBackgroundonPostExecute 来完成它,但我想使用 Rx ObservableSubscriber 来完成它。 我已经使用过调度程序,所以我知道如何在线程之间切换,我只是不知道如何将所有这些放在一起并使其工作!

我需要代码的示例或 sn-p 并稍微解释一下,谢谢!

【问题讨论】:

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


【解决方案1】:

你可以试试这样的:

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));
    }
}

【讨论】:

    【解决方案2】:

    我终于找到了解决方案:

    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));
          }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多