2016-04-01 6 views
0

私はRoboSpiceをOkHttpClientモジュール(OkHttpSpiceService)で長時間のリクエストに使用します。そのためにはhttpクライアントのタイムアウトを増やす必要がありますので、120秒で設定してください。RoboSpiceサービスのloadDataFromNetwork()を呼び出す時間を増やす

@Override 
    protected OkHttpClient createOkHttpClient() { 
      OkHttpClient okHttpClient = super.createOkHttpClient(); 
      okHttpClient.setConnectTimeout(120, TimeUnit.SECONDS); 
      okHttpClient.setReadTimeout(120, TimeUnit.SECONDS); 
      okHttpClient.setWriteTimeout(120, TimeUnit.SECONDS); 
      return okHttpClient; 
} 
私はこのSpiceServiceが loadDataFromNetwork() 30秒ごとに(3回)、応答が来ていないか、この短い時間で到達できないされたときに起動した後

getSpiceManager().execute(spiceRequest, this); 

でSpiceRequestを呼び出すので、私は、キャッシングのオプションを使用しないでください

呼び出す時間を増やすか変更するのは、いずれのポビビットですか?loadDataFromNetwork()?私は1分後に反応が出ることを知っていますが、この方法を使って私は適切な応答に達することができません。デフォルトRoboSpiceことで

答えて

0

は、このようなDefaultRetryPolicyを使用しています。

/** The default number of retry attempts.*/  
public static final int DEFAULT_RETRY_COUNT = 3; 

/** The default delay before retry a request (in ms). */ 
public static final long DEFAULT_DELAY_BEFORE_RETRY = 2500; 

何ができるかDefaultRetryPolicyクラスを拡張することにより、この二つの方法オーバーライドすることで、独自の再試行ポリシーを実装することです:

public class CustomRetryPolicy extends DefaultRetryPolicy { 
    @Override 
    public int getRetryCount() { return 1; } 

    @Override 
    public long getDelayBeforeRetry() { return 120L * 1000; } 
} 

カスタムリトライポリシーを使用すると、次のようになります。

spiceRequest.setRetryPolicy(new CustomRetryPolicy()); 

ここを見てみましょう:私はところでgetSpiceManager().execute(spiceRequest, this);

でSpiceRequestを呼び出すので、私は、キャッシングのオプションを使用しない https://github.com/stephanenicolas/robospice/wiki/Advanced-RoboSpice-Usages-and-FAQ#how-can-i-setup-a-retry-policy-for-failed-requests-

、これはキャッシュを使用してからのRoboSpiceを停止しません。 av_leeが提供する答えは正しいですが、カスタムの定義方法

public class MyOkHttpSpiceService extends OkHttpSpiceService { 

@Override 
public CacheManager createCacheManager(Application application) { 
    // Just return an empty CacheManager 
    return new CacheManager() { 
     @Override 
     public <T> T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException, CacheCreationException { 
      return data; 
     } 
    }; 
} 

}

+0

OKこの値を試してみます。 RetryPolicyのカスタム値を実装してRetryPolicyの値を変更しましたが、常に1つ以上のリクエストを行いました。遅延フラグを設定した後は、常に同じ結果が得られます。 30秒後に要求がタイムアウトし、120秒後に次の要求が送信されたようです(120Lにフラグが設定されている場合) –

+0

サーバー側で30秒のタイムアウトが発生したようです。私は最初のケースでは30秒のネットワーク+ Robospiceのデフォルトの再試行タイムアウトの2.5秒だったと思う。 2番目のケースでは、30秒のネットワーク+ 120秒のRoboSpiceの再試行タイムアウトが必要です。 Wiresharkを使用して、実際にネットワーキングで起こっていることを確認してください。タイムアウトが頻繁に起こることは疑わしい。 – mykolaj

+0

数日後、私はこの問題に戻り、いくつかの発言があります。まず、あなたのアプローチは100%ではなく問題を解決します。それは要求の時間を増加させますが、遅延の形になります。私は使用しているサーバーが10秒後にタイムアウトを送信した後、このロススピスの待ち時間がCustomRetryPolicyに設定されていることを確認します。それは今でもOKです。なぜなら、サーバーが私の要求をキャッシュしていて、応答が準備ができていれば、次の要求で私を送ります。 –

0

:本当にあなたがこのような独自のOkHttpSpiceService実装でcreateCacheManagerメソッドをオーバーライドする必要があるキャッシュを使用してからSpiceServiceを停止するにはRoboSpiceの再試行ポリシーが正しくありません。上記のコードは、失敗した場合に無期限にコールを再試行します。 RoboSpiceはgetRetryCount()によって返された値を常に使用し、再試行後に値を減らしますが、次回は再び値1を取得します。 カスタム再試行ポリシーを実装する正しい方法は、DefaultRetryPolicyクラスの値を設定することです。この上記のコードで

public class CustomRetryPolicy extends DefaultRetryPolicy { 
    public CustomRetryPolicy(int retryCount) { 
     super(retryCount, DEFAULT_DELAY_BEFORE_RETRY, DEFAULT_BACKOFF_MULT); 
    } 
} 

、retryCount値は、再試行およびバックオフ乗数前の遅延のためのあなたの要求とデフォルト値が使用されているため、必要な再試行回数です。これらの3つの値のうち、任意の値を使用できます。

関連する問題