2017-04-18 4 views
0

ファイルといくつかのデータをサーバにアップロードするために単純なIntentServiceを作成しました。アップロードが完了したらToastを表示できるようにしたいが、そうするためにはメインスレッドにする必要がある。RxJavaサービススレッドを購読する

実際のリクエストを処理するためにRxJavaと組み合わせてRetroFitを使用しているので、observeOn(AndroidSchedulers.mainThread())メソッドを使用してメインスレッドにToastを作成する必要があると考えました。問題は(サーバーのために)私は要求を再送する必要があるかもしれないという場合です。この場合、postRequest()メソッドを再度呼び出さなければなりません。

この新しい要求がメインスレッドに追加されました。したがって、私はsubscribeOn(Schedulers.io())メソッドを使用することを避けるために、これは無駄に思えますが、Serviceはすでに独自のスレッドにあると考えています。

ObservablesubscribeOn()Serviceスレッドになるはずですか?またはIntentServiceの代わりにServiceをサブクラス化して、ioスレッドを使用するだけですか?

private void postRequest(String title, LatLng location, 
         String description, MultipartBody.Part attachment) { 
    mNetworkService.postRequest(title, location.latitude, location.longitude, 
      description, attachment).subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(response -> { 
       if (response.status() == 1) { 
        ToastUtil.makeText(getApplicationContext(), "Request Sent"); 
        stopSelf(); 
       } else { 
        postRequest(title, location, description, attachment); 
       } 
      }); 
} 

答えて

1

私はそこに何かが見逃されていますが、「トースター」を購読する前にストリームをフィルタリングしないのはなぜですか?私。ストリームをresponse.status()でフィルタリングします。成功した場合、トースターにすぐに渡すことができます。

これは、メインスレッドに戻る前に発生する可能性があるため、そこから再送信する必要はありません。

2

IntentServiceを使用しているかどうかはわかりませんが、これについてはどうやってやっていけるのですか。もちろん、Rxでそのスレッドを使用することは可能です。

IntentServiceは、ルーパーを使用して作業を行います。 AndroidSchedulers.mainThread()の内部を実際に見ていると、実際にメインスレッドのルーパーからスケジューラを作成していることがわかります。あなたがしたいのは、IntentService Looperからスケジューラを作成することです。

.observerOn(intentScheduler) 

または

.subscribeOn(intentScheduler) 

そして、それはIntentService

のスレッドを使用する必要があります。

Scheduler intentScheduler = AndroidSchedulers.from(Looper.myLooper()); 

が次にあなたが行うことができます:

あなたは使ってこれを行うことができます

関連する問題