23

私はRxJavaにかなり慣れていないので、これはおそらくばかげた質問です。私のシナリオを説明します。

一部の画像を更新するUIスレッドで実行されているコードがありますが、それらの画像はそれほど重要ではなく、生成中に少しリソースを消費するため、単一のスレッド(もちろんUIスレッドではありません)で生成したいと思います。それらを1つずつ生成します。私はトランポリンスケジューラが私が望むものだと推測していますが、私の問題は、それを使用するとUIスレッドで動作し、別のスレッドで実行したいということです。

明らかに、アイテムをキューに入れることができる独自のスレッドを作成して、それらを1つずつ処理できますが、RxJavaには簡単な解決策があると思いましたか?

私の現在のコードは次のようになります。

Observable<Bitmap> getImage = Observable.create(new Observable.OnSubscribe<Bitmap>() {
    @Override public void call(Subscriber<? super Bitmap> subscriber) {
        Log.w(TAG,"On ui thread? "+ UIUtils.isRunningOnUIThread());
        subscriber.onNext(doComplexTaskToGetImage());
        subscriber.onCompleted();
    }
});

getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1<Bitmap>() {
    @Override public void call(Bitmap bitmap) {
        codeToSetTheBitmap(bitmap);
    }
});

「UIスレッドで?」という私のログ 常に真です。では、そのコードと、同じことを実行しようとする後続のすべての試みを単一のスレッド (UI スレッドではなく) で実行して、その作業をキューに入れるための大量のコードを作成する必要がないようにするにはどうすればよいでしょうか?

編集:

これは、を使用して達成できるSchedulers.single()と思います。または、独自のものを使用したい場合は、を使用できますnew SingleScheduler()。私はまだテスト中ですが、これを投稿したときに望んでいたことをしていると思います。

4

3 に答える 3

17

次のいずれかの方法で、単一の再利用可能なスレッドを作成して を作成できSchedulerます。Observable

  • ThreadPoolExecuterプール サイズが 1 の を作成し(Executors.newSingleThreadExecutor()はそれを行うための便利な静的ファクトリ メソッドです)、それを使用してSchedulers.from()メソッドを介してスケジューラを生成します。
  • RxAndroidは、 を使用してアクションをスケジュールするカスタムScheduler実装を提供するため、ファクトリ メソッドにを渡すことで、実行中のHandler任意のもので使用できます。ThreadLooperHandlerAndroidSchedulers.handlerThread()

Schedulerこれらのタスクの最後に UI を操作している場合は、メイン スレッドで監視する必要があることに注意してください。

于 2015-04-18T19:05:32.187 に答える