web-dev-qa-db-ja.com

バレーボールタイムアウト時間の変更

私は私のサーバーにリクエストをするためにAndroid用の新しいVolleyフレームワークを使います。しかしそれは応答しますが、応答を得る前にタイムアウトします。

私はこのコードを追加してみました:

HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);

volleyフレームワークのHttpClientStackでは、別の整数(50000)に設定されていますが、50秒前にタイムアウトします。

タイムアウトを長い値に変更する方法はありますか?

180
Cissmayazz

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));
343
larham1

Android Volley Timeoutを処理するには、RetryPolicyを使用する必要があります

再試行ポリシー

  • Volleyはあなたの要求にあなたのRetryPolicyを実装する簡単な方法を提供します。
  • Volleyは、すべての要求に対してデフォルトのSocket&ConnectionTImeoutを5秒に設定します。

RetryPolicyは、タイムアウトが発生したときに特定の要求を再試行する方法のロジックを実装する必要があるインターフェースです。

それはこれら3つのパラメータを扱います

  • タイムアウト - 再試行のたびにソケットタイムアウトをミリ秒単位で指定します。
  • 再試行回数 - 再試行が試行された回数。
  • Back Off Multiplier - 再試行のたびにsocketに設定された指数時間を決定するために使用される乗数。

例えば。これらの値でRetryPolicyが作成された場合

タイムアウト - 3000ミリ秒、再試行回数 - 2、乗算器のバックオフ - 2.0

再試行1:

  • time = time +(time *バックオフ乗数);
  • 時間= 3000 + 6000 = 9000ミリ秒
  • ソケットタイムアウト=時間。
  • 9秒のソケットタイムアウトでディスパッチされた要求

再試行2:

  • time = time +(time *バックオフ乗数);
  • 時間= 9000 + 18000 = 27000ms
  • ソケットタイムアウト=時間。
  • 27秒のソケットタイムアウトでディスパッチされた要求

それで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));
214
Yakiv Mospan

私のアプローチに貢献するためだけに。すでに回答したように、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を持っているので、特定のリクエストにポリシーを設定するのを忘れるというリスクを負うことはありません。

22
Androiderson
/**
 * @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);
}
11
chavanNil
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です。

6
Manasvi
int MY_SOCKET_TIMEOUT_MS=500;

 stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
3
Avinash

それを行うもう1つの方法は、カスタムJsonObjectRequestに次の方法であります。

@Override
public RetryPolicy getRetryPolicy() {
    // here you can write a custom retry policy and return it
    return super.getRetryPolicy();
}

ソース: Androidのバレーボールの例

2
KnowIT

上記のすべての解決策がうまくいかない場合の代替解決策

デフォルトでは、Volleyは、RetryPolicyからの値を使用して、setConnectionTimeout()setReadTimeout()の両方に等しくタイムアウトを設定します。私の場合、Volleyは大きなデータチャンクに対してタイムアウト例外を投げます:

com.Android.volley.toolbox.HurlStack.openConnection(). 

私の解決策は、私自身のsetReadTimeout()ポリシーでHttpStackを拡張するクラスを作成することです。それから、RequestQueueを作成するときに次のように使用します。

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())
2
Bao Le

私はメソッドsetCurrentTimeout(int timeout)RetryPolicyに追加し、それをDefaultRetryPolicyに実装しました。

次に、RequestクラスにsetCurrentTimeout(int timeout)を追加して呼び出しました。

これは仕事をしているようです。

ちなみに私の怠惰のためにすみません、そしてオープンソースのためにhooray。

1
Cissmayazz