2016-08-25 5 views
0

rxandroid/rxjavaのサブスクリプション(subscribeOn以下のコードはその特定のスレッドで実行されます)の概念をよく理解しています(subscribeOnと同じです)。異なるスレッドで操作を実行し、rxandroidのメインスレッドに通知する方法は?

バックグラウンドスレッドでlong io操作を実行し、操作が完了した場合にメインスレッドに通知します。このようにブロックしていない、

Observable.just(1) 
      .subscribeOn(Schedulers.io()) 
      .flatMap(o -> { 
      longIO(); 
      return null;}) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(//i want to notify user here); 

これは実際には別のスレッドでlongIO()を実行している:これを行うには、私はその後、subscribeAndroidSchedulers.mainThread()にこのような何かを観察Schedulers.io()に加入しているflatmapを持つと思っていますメインスレッドではない場合は、ToastまたはAlertDialogを作成して、アンドロイドは通知することができませんので、メインスレッドにはlongIO()が完了していることを通知しません。私はflatMap内部メソッドを実行することにしたいので、私は整数1を使用していないにもかかわらず、just(1)を使用:コードがsubscribe

を通過していないようです。 emptyを使用した場合、それは通過しません。flatMap

+0

http://stackoverflow.com/questions/34272955/schedulers-io-not-returning-to-main-thread?rq=1これを参照してくださいリンク – Vijayaramanan

+0

これで問題が解決するかどうかは後で確認します。 – hehe

答えて

0

戻り値のタイプflatMapObservableです。 flatMapがNULL Observableを返した場合、サブスクライバは通知を受けません。 return Observable.just(null);

にreturn文を変更します。しかし、それはあなたのlongIO()方法をラップするObservable.fromCallable()を使用するのが好ましいですので、just(1)は時代遅れになり、コードがきれいに見えます。注:返品タイプがfromCallable()でない場合は、Observableであるため、nullが返された場合でも、ユーザに通知されます。それは次のようになります:

Observable.fromCallable(() -> { 
     longIO; 
     return null; 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(
0

あなたはいくつかのことに間違っていると思います。 ABOVE subscribeOn()のすべてのIMOは、スレッドプールから特定のスレッドで実行されます。そして、もちろん、すべてBELOW observeOnはUIスレッドに渡す必要があります。

第2の事柄 - あなたのflatMapオペレータがnullを返すことを実行することはできません。 Observableを返す必要があります。データを渡す必要がない場合は、Observable.just(null) or Observable.never()を使用できます。

私はよりよい解決策があることだろうと思う:

Observable.create(new Observable.OnSubscribe<Object>() { 
    @Override 
    public void call(final Subscriber<? super Object> subscriber) { 
     longIO(); 
     } 
    }) 
    .startWith(new Object()) //if you want to run it once 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(); 
関連する問題