2017-01-26 13 views
0
Volley 
     .newRequestQueue(context) 
     .add(new JsonObjectRequest(
       Request.Method.POST, 
       BuildConfig.API_URL + "/user", 
       userJson, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         doSthOnRequestSuccess(); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         doSthOnRequestFail(); 
        } 
       })); 

リクエストがタイムアウトすると、ErrorListenerが実行され、その後、Volleyは自動的にリクエストを再試行し、今回は成功します。しかし、成功応答リスナーは実行されません。リクエストリトライ後にAndroidボレー応答リスナーが呼び出されない

たとえば、ユーザーが何らかのボタンをクリックしたときにリクエストが失敗するとリクエストが失敗するため、操作が失敗したというエラーメッセージが表示されます。画面は現在エラー状態ですが、Volleyはバックグラウンドでリクエストを再試行しますが、成功しますが、成功したリスナーコードは呼び出されません。これにより、画面がエラー状態のままになるか、ユーザーがボタンをもう一度クリックして重複要求を行うことになります。

私は、ボレーが重複要求を処理できるように呼び出すAPIを変更しましたが、これをアンドロイド側で解決する方法はありますか?

+0

あなたは 'それは、このセクションを実行して確保するonResponse'方法をログに記録しますか? – Saeid

答えて

1

最後に試した後にボレーがコールバックを与えると思います。つまり、最大再試行回数を3回、apiが2回失敗し、3回失敗した場合は、onResponse()コールバックを取得します。

1

Volleyはリクエストごとにエラーまたは成功のいずれかを返します。つまり、onErrorResponseが呼び出されたときに、onResponseが呼び出されることを期待してはいけません。

ほとんどの場合、リトライによるリクエストが失敗した可能性があります。しかし、サーバが処理して、最後のリクエストをあなたのVolleyクライアントから送信した可能性がありますが、データは時間通りに到達できませんでした。より詳細には

コールは、成功または例外までBasicNetworkクラスでループしています。特定の例外に関して、attemptRetryOnExceptionが呼び出されます。ここでは、要求のRetryPolicyに例外を渡すか、無視して再試行するかどうかを通知します。通常これはDefaultRetryPolicyです。 これから、Volleyから最終コールバックを1つだけ受け取ることがわかります。

それらの再試行を監視するための一つの方法は、マーカーでログを有効にすることですしかし:

<android-sdk>/platform-tools/adb shell setprop log.tag.Volley VERBOSE 
+0

あなたは、いくつかの再試行、エラーまたは成功リスナーが呼び出された後にのみ、それは言う?ボレーが失敗したと判断してエラーリスナーを呼び出すと、サーバーは応答しますか? – Reek

+0

Q1 - はい Q2 - これは1つの場合もありますが、サーバーはオンタイムで応答しますが、クライアントの読み取り(ネットワークからバイトを取得)はタイムアウトする可能性があります。 – djodjo

関連する問題