2016-05-18 5 views
1

私の目標は、例外をスローすることによって並列実行要求の数を制限することです。例えばRetrofit 2.0で並列要求を制限する方法は?

、私は唯一の実行要求欲しい:

someApi.getUser(
    result -> print("ok: " + result), exception -> print("error: " + exception) 
); // this request will be executed in 5 seconds 

someApi.getServerInfo(
    result -> print("ok: " + result), exception -> print("error: " + exception) 
); // there I want to catch exception like ExecutorIsBusy 

どのように私はレトロフィット2.0でそれを実装することができますか?

+1

これはあなたの質問にはあまり答えませんが、正しい方向に向けるかもしれません。ここでは2つの可能性を考えています。まず、このリンクhttp://stackoverflow.com/questions/23255523/parallel-http-requests-with-retrofit/23255889をチェックしてください。それはRetrofit 1&2ではないので、私はそれが適用できないと確信していません。次に、コールを観測可能にして、条件付き演算子を使用して、現在のものが終了するまで他のサブスクリプションの発生を抑えることができます。 –

答えて

1

私は実際に、@DanielのコメントExceptionを投げることは、それを行うための最良の方法ですが、私はこの点を説明しませんので、私はあなたのユースケースを知らない:)

をとにかくすることを確認していませんかなり良い方向を指しています。 retrofitOkHttpを使用している場合は、「同時リクエスト」を処理するのはOkHttpClientです。ドキュメントを読むと、OkHttpがDispatcherを使用して並列非同期リクエスト(Dispatcher docs)を処理することがわかります。

ので、2つの興味深いポイントは以下のとおりです。

  1. 方法setMaxRequests(int maxRequests):最大同時要求
  2. 方法executed(RealCall call)を定義しています。実際に私はあなたがあなたの目標を達成するために、これを行うことができると思いリクエスト

を実行:

  1. カスタムを作成Dispatcherクラス
  2. オーバーライド電流要求の数がmaxRequests
  3. あなたがretrofitアプローチを取っRxJava &を使用して
+0

ありがとうございます。私はあなたの解決策を試みます。 – Alexandr

+0

'>例外を投げることが最善の方法であるとは確信していません;私は同時に1つのリクエストしか実行する必要はありません。そして、私は現在が実行される前に要求を拒否する必要があります。 Exceptionを投げるよりも適切なことは何ですか? @DanielはObservableを使うことを提案していますが、私は今すぐ反応型プログラミングを使い始めたので、それをどうやって行うのか想像できません。 – Alexandr

+0

私もどちらか分かりません;) "試して失敗する"の代わりにそれをしてはならないなら、あなたの要求を試してみるほうがいいかもしれません;) – mithrop

1

で使用しているOkHttpClientでカスタムDispatcherを使用するよりも優れている場合executed(RealCall call)メソッドが例外をスロー上のコメントでは、ここに例があります:

これらの操作はボタンに付けられているものとします。

public void runObservable1(View view) { 
    if (!taskRunning){ 
     try{ 
      taskRunning = true; 
      subsonicService.runTask1() 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .compose(this.<Result>bindUntilEvent(ActivityEvent.DESTROY)) 
        .subscribe(new Subscriber<Result>() { 
         @Override 
         public void onCompleted() { 
          taskRunning = false; 
         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(Result result) { 
          //your logic here 
         } 
        }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Toast.makeText(this, "Task is running you must wait", Toast.LENGTH_SHORT).show(); 
    } 


} 

public void runObservable2(View view) { 

    if (!taskRunning){ 
     try{ 
      taskRunning = true; 
      subsonicService.runTask2() 
        .subscribeOn(Schedulers.io()) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .compose(this.<Result>bindUntilEvent(ActivityEvent.DESTROY)) 
        .subscribe(new Subscriber<Result>() { 
         @Override 
         public void onCompleted() { 
          taskRunning = false; 
         } 

         @Override 
         public void onError(Throwable e) { 

         } 

         @Override 
         public void onNext(Result result) { 
          //Logic here 
         } 
        }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Toast.makeText(this, "Task is running you must wait", Toast.LENGTH_SHORT).show(); 
    } 
} 

私はRxJavaでもエキスパートではないので、これを簡単にする演算子があるかもしれません。

関連する問題