私は私のサーバーにリクエストをするためにAndroid用の新しいVolleyフレームワークを使います。しかしそれは応答しますが、応答を得る前にタイムアウトします。
私はこのコードを追加してみました:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
volleyフレームワークのHttpClientStack
では、別の整数(50000)に設定されていますが、50秒前にタイムアウトします。
タイムアウトを長い値に変更する方法はありますか?
Request.setRetryPolicy()
とDefaultRetryPolicy
のコンストラクタを見てください。
JsonObjectRequest myRequest = new JsonObjectRequest(Method.GET,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(TAG, "Error: " + error.getMessage());
}
});
myRequest.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Android Volley Timeoutを処理するには、RetryPolicy
を使用する必要があります
RetryPolicy
は、タイムアウトが発生したときに特定の要求を再試行する方法のロジックを実装する必要があるインターフェースです。
それはこれら3つのパラメータを扱います
例えば。これらの値でRetryPolicyが作成された場合
タイムアウト - 3000ミリ秒、再試行回数 - 2、乗算器のバックオフ - 2.0
再試行1:
再試行2:
それでRetry Attempt 2の最後でそれでもSocket Timeoutが発生すると、VolleyはあなたのUI ErrorレスポンスハンドラにTimeoutError
を投げます。
//Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions.
//Volley does retry for you if you have specified the policy.
jsonObjRequest.setRetryPolicy(new DefaultRetryPolicy(5000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
私のアプローチに貢献するためだけに。すでに回答したように、RetryPolicy
がその道です。しかし、すべてのリクエストに対してデフォルトとは異なるポリシーが必要な場合は、それを基本Requestクラスに設定することができるので、リクエストのすべてのインスタンスに対してポリシーを設定する必要はありません。
このようなもの:
public class BaseRequest<T> extends Request<T> {
public BaseRequest(int method, String url, Response.ErrorListener listener) {
super(method, url, listener);
setRetryPolicy(getMyOwnDefaultRetryPolicy());
}
}
私の場合は、このBaseRequestから拡張されたGsonRequestを持っているので、特定のリクエストにポリシーを設定するのを忘れるというリスクを負うことはありません。
/**
* @param request
* @param <T>
*/
public <T> void addToRequestQueue(Request<T> request) {
request.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
getRequestQueue().add(request);
}
req.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MY_SOCKET_TIMEOUT_MS
を100に設定できます。これを設定したいものは何ミリ秒単位です。 DEFAULT_MAX_RETRIES
は0にすることができ、デフォルトは1です。
int MY_SOCKET_TIMEOUT_MS=500;
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
それを行うもう1つの方法は、カスタムJsonObjectRequestに次の方法であります。
@Override
public RetryPolicy getRetryPolicy() {
// here you can write a custom retry policy and return it
return super.getRetryPolicy();
}
ソース: Androidのバレーボールの例
上記のすべての解決策がうまくいかない場合の代替解決策
デフォルトでは、Volleyは、RetryPolicy
からの値を使用して、setConnectionTimeout()
とsetReadTimeout()
の両方に等しくタイムアウトを設定します。私の場合、Volley
は大きなデータチャンクに対してタイムアウト例外を投げます:
com.Android.volley.toolbox.HurlStack.openConnection().
私の解決策は、私自身のsetReadTimeout()
ポリシーでHttpStack
を拡張するクラスを作成することです。それから、RequestQueue
を作成するときに次のように使用します。
Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
私はメソッドsetCurrentTimeout(int timeout)
をRetryPolicy
に追加し、それをDefaultRetryPolicy
に実装しました。
次に、RequestクラスにsetCurrentTimeout(int timeout)
を追加して呼び出しました。
これは仕事をしているようです。
ちなみに私の怠惰のためにすみません、そしてオープンソースのためにhooray。