ボレータイムアウト期間を変更する


190

Android向けの新しいVolleyフレームワークを使用して、サーバーにリクエストを送信します。ただし、応答はしますが、応答を取得する前にタイムアウトします。

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

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

HttpClientStack50秒前に出異なる整数(50000)のバレーボールフレームワークの、それはまだ時間。

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



21
@AdamStelmaszczyk-これは、Volleyフレームワークの特定の詳細に関するものであるため、重複することはありません。HttpClientクラスの使用については、参照されているSOの質問。
Michael Banzon 2013年

回答:


357

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

リクエストの優先度を設定する方法も知っていますか?
マーカス2013年

2
@MarkusはReq​​uest.getPriority()をオーバーライドして、「通常」以外の何かを返します。ImageRequestがこれを行います。注:別のSOの質問でこれを尋ねる必要があります。
larham1 2013年

1
これは、ボレーが15秒かかるリクエストを破棄しないようにするために私が探していたものとまったく同じです。-ありがとう!
スロット

これをPOSTリクエストに追加して、タイムアウト時の再試行を無効にしました。Google開発者がPOSTリクエストに再試行ポリシーを設定することを決定したのは信じられないほどの間違いです。私の問題を解決しました。ありがとう。
Proverbio 2014

1
@ Roon13は、追加されたばかりのサンプルリクエストコンストラクターを参照してください。
larham1

226

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

RetryPolicy

  • Volleyは、リクエストに対してRetryPolicyを実装する簡単な方法を提供します。
  • Volleyは、すべての要求に対してデフォルトのソケットと接続TImeoutを5秒に設定します。

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

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

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

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

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

再試行1:

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

再試行2:

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

そのため、再試行2の最後にソケットタイムアウトが発生した場合、VolleyはTimeoutErrorUIエラー応答ハンドラーでをスローします。

//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実装が実際に行うことについての詳細な回答に感謝します。
dbm

5
@Yakiv Mospanですが、あなたの例では、最初の試行の時間は3000 +(3000 * 2)ではなく0 +(3000 * 2)です。そして2番目の6000 +(3000 * 2)。
2013年

13KZ、私はあなたが時間計算に関してまだ間違っていると思います、私の編集を見て、ボレーソースに対して確認してください
Protongun

1
これを使っている人のためだけのリマインダー:常に使用new DefaultRetryPolicy(とすることを確認し再利用することはありませんRetryPolicyオブジェクトは、すべての要求プロセスを介して参照され、リトライ増加は、このようにあなたの将来の要求のタイムアウトが無限に成長すること、同じオブジェクトのタイムアウト値の上に追加されると、オブジェクトを
IG Pascual

接続ハンドシェイクのタイムアウトはどうですか?
GMsoF 2017年

23

私のアプローチで貢献するためだけに。すでに答え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があるので、特定のリクエストのポリシーを設定するのを忘れるリスクを冒すことはありません。特定のリクエストで必要な場合は、ポリシーをオーバーライドできます。


1
これは正しく動作するはずですか?setRetryPolicy(new DefaultRetryPolicy(1000、DefaultRetryPolicy.DEFAULT_MAX_RETRIES、DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
LOG_TAG 2015

12
/**
 * @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);
}

7
req.setRetryPolicy(new DefaultRetryPolicy(
    MY_SOCKET_TIMEOUT_MS, 
    DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

MY_SOCKET_TIMEOUT_MS100に設定できます。これに設定するものはすべてミリ秒単位です。DEFAULT_MAX_RETRIES0にすることもできます。デフォルトは1です。


4
int MY_SOCKET_TIMEOUT_MS=500;

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

3

これを行う別の方法は、カスタムJsonObjectRequestで次のようにすることです。

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

出典:Android Volleyの例


2

上記のすべてのソリューションが機能しない場合の代替ソリューション

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

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

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

Volley.newRequestQueue(mContext.getApplicationContext(), new MyHurlStack())

1

最終的ににメソッドsetCurrentTimeout(int timeout)を追加し、RetryPolicyそれをで実装しましたDefaultRetryPolicy

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

これでうまくいくようです。

ちなみに私の怠惰とオープンソースの申し訳ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.