2016-10-21 2 views
0

私はvolleyのリトライポリシーを設定しました。タイムアウト時間に達していないにもかかわらず、クエリが2回送信されています。タイムアウト時間に達する前にVolley RetryPolicyを2回クエリします

StringRequest stringRequest = new StringRequest(method, currentURL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        S.L("response: " + currentURL); 
        listener.onRequestExecuted("response", response, downloadId); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.d("CCC", "Error " + error.toString());            
       } 
      }) 

これはSOこれに関連する別のquestionがあった上で、以前の

stringRequest.setRetryPolicy(new RetryPolicy() { 
     @Override 
     public int getCurrentTimeout() { 
      return 8000; 
     } 

     @Override 
     public int getCurrentRetryCount() { 
      return 1; 
     } 

     @Override 
     public void retry(VolleyError error) throws VolleyError { 
      S.L("Retry error: " + error); 
     } 
    }); 

再試行方針でした。タイムアウト時間に達していないにもかかわらず、ボレーが低速接続を検出したときにそうなるようです。ここでは解決策は、異なる再試行ポリシーを使用していた:

stringRequest.setRetryPolicy(new DefaultRetryPolicy(8000, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
      DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

これが働いており、なぜ再試行の政策との動作の違いがあるのタイムアウト期間に

を唯一の単一のクエリを送信していますか?

答えて

0

なぜリトライポリシーの動作に違いがありますか?

異なるretry()の実装のためです。 DefaultRetryPolicyのソースコードから

:コンストラクタにDefaultRetryPolicy.DEFAULT_MAX_RETRIESを渡すことによって

@Override 
public void retry(VolleyError error) throws VolleyError { 
    mCurrentRetryCount++; 
    mCurrentTimeoutMs += (mCurrentTimeoutMs * mBackoffMultiplier); 
    if (!hasAttemptRemaining()) { 
     throw error; 
    } 
} 

protected boolean hasAttemptRemaining() { 
    return mCurrentRetryCount <= mMaxNumRetries; 
} 

、あなたは効果的1からmMaxNumRetriesを設定しています。

2回目の再試行時にhasAttemptRemaining()falseを返し、VolleyErrorがスローされます。

関連する問題