Volley zaman aşımı süresini değiştirme


191

Sunucuma bir istekte bulunmak için Android için yeni Volley çerçevesini kullanıyorum. Ancak yanıt almasına rağmen zaman aşımına uğrar.

Bu kodu eklemeyi denedim:

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

olarak HttpClientStackfarklı bir tam sayı (50000) Voleybolu çerçevesinin, ama yine de zaman üzerinden 50 saniye önce.

Zaman aşımını uzun bir değere değiştirmenin bir yolu var mı?



21
@AdamStelmaszczyk - Volley çerçevesindeki belirli ayrıntılarla ilgili olduğu için bu bir kopya olmaz. HttpClientSınıfın kullanımı hakkında başvurulan SO sorusu .
Michael Banzon

Yanıtlar:


359

Görmek Request.setRetryPolicy() ve yapıcı için DefaultRetryPolicy, örneğin

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

Bir isteğin önceliğini nasıl ayarlayacağınızı da biliyor musunuz?
Markus

2
@Markus, 'normal' dışında bir şey döndürmek için Request.getPriority () öğesini geçersiz kılar. ImageRequest bunu yapar. NOT: bunu ayrı bir SO sorusunda sormalısınız.
larham1

1
Bu tam olarak Volley'nin 15 saniye süren isteğimi atmasını önlemek için aradığım şeydi. - Teşekkürler!
slott

Ben sadece zaman aşımına uğradığında yeniden denemeyi devre dışı bırakmak için POST istekleri için ekledi. Google Developers'ın POST isteklerinde bir yeniden deneme politikası belirlemeye karar vermesi inanılmaz derecede yanlış. Sorunumu çözdü. Teşekkürler.
Proverbio

1
@ Roon13, yeni eklenen örnek istek yapıcısına bakınız.
larham1

226

Android Volley Timeout'u işlemek için RetryPolicy

RetryPolicy

  • Volley, RetryPolicy'inizi istekleriniz için uygulamak için kolay bir yol sağlar.
  • Volley, tüm soketler için varsayılan Soket ve BağlantıTImeout değerini 5 saniyeye ayarlar.

RetryPolicy zaman aşımı olduğunda belirli bir isteği nasıl yeniden denemek istediğinize dair mantığınızı uygulamanız gereken bir arayüzdür.

Bu üç parametre ile ilgilenir

  • Zaman Aşımı - Her yeniden deneme girişiminde milis olarak Soket Zaman Aşımı değerini belirtir.
  • Yeniden Deneme Sayısı - Yeniden denemeye başlama sayısı.
  • Geri Kapalı Çarpanı - Her yeniden deneme denemesi için sokete ayarlanan üstel süreyi belirlemek için kullanılan bir çarpan.

Örn. Bu değerlerle RetryPolicy oluşturulmuşsa

Zaman Aşımı - 3000 ms, Tekrar Deneme Sayısı - 2, Geri Kapalı Çarpanı - 2.0

Yeniden Deneme Denemesi 1:

  • zaman = zaman + (zaman * Geri Kapalı Çarpanı);
  • zaman = 3000 + 6000 = 9000ms
  • Soket Zaman Aşımı = zaman;
  • 9 saniyelik Soket Zaman Aşımı ile gönderilen istek

Yeniden Deneme Denemesi 2:

  • zaman = zaman + (zaman * Geri Kapalı Çarpanı);
  • zaman = 9000 + 18000 = 27000ms
  • Soket Zaman Aşımı = zaman;
  • 27 saniyelik Soket Zaman Aşımı ile gönderilen istek

Yeniden Deneme Denemesi 2'nin sonunda hala Yuva Zaman Aşımı oluşursa Volley TimeoutError, UI Hatası yanıt işleyicinize bir atar .

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

RetryPolicyUygulamanın gerçekte ne yaptığına dair ayrıntılı bir cevap için teşekkürler .
dbm

5
Güzel cevap @Yakiv Mospan.Ama örnekte, ilk denemenin zamanı 3000 + (3000 * 2) yerine 0 + (3000 * 2). Ve ikincisi 6000 + (3000 * 2).
13KZ

13KZ, zaman hesaplamaları konusunda hala yanlış olduğuna inanıyorum, düzenlememe bakın ve volley kaynağına karşı doğrulayın
Protongun

1
Bu kullanan kişiler için Sadece bir hatırlatma her zaman kullanmak new DefaultRetryPolicy(ve emin olun asla kullanmayın bir RetryPolicynedenle gelecekteki isteği zaman aşımına uğrayan sonsuz büyümeye yapma, nesne tüm istek sürecinde başvurulan olduğunda, nesneyi ve yeniden deneme artışlarla aynı nesne zaman aşımı değeri üzerinden eklenir
IG Pascual

bağlantı anlaşması zaman aşımı nasıl?
GMsoF

23

Sadece yaklaşımımla katkıda bulunmak için. Daha önce yanıtlandığı gibi, RetryPolicygitmenin yolu. Ancak, tüm istekleriniz için varsayılandan farklı bir politikaya ihtiyacınız varsa, bunu temel bir İstek sınıfında ayarlayabilirsiniz, böylece isteklerinizin tüm örnekleri için politikayı ayarlamanız gerekmez.

Bunun gibi bir şey:

public class BaseRequest<T> extends Request<T> {

    public BaseRequest(int method, String url, Response.ErrorListener listener) {
        super(method, url, listener);
        setRetryPolicy(getMyOwnDefaultRetryPolicy());
    }
}

Benim durumumda bu BaseRequest uzanan bir GsonRequest var, bu yüzden belirli bir istek için ilkeyi ayarlamak için unutma riskini çalıştırmak ve bazı özel istek gerektiriyorsa yine de geçersiz kılabilirsiniz.


1
Bu işe yaramalı mı? setRetryPolicy (yeni DefaultRetryPolicy (1000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
LOG_TAG

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 olarak ayarlayabilirsiniz. Bunu ayarlamak istediğiniz her şey milisaniye cinsindendir. DEFAULT_MAX_RETRIES0 olabilir varsayılan 1'dir.


4
int MY_SOCKET_TIMEOUT_MS=500;

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

3

Bunu yapmanın başka bir yolu da özel JsonObjectRequest'te:

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

Kaynak: Android Volley Örneği


2

Yukarıdaki tüm çözümler sizin için çalışmıyorsa alternatif çözüm

Varsayılan olarak, Volley ikisi için eşit zaman aşımı ayarlamak setConnectionTimeout()ve setReadTimeout()gelen değerle RetryPolicy. Benim durumumda, Volleybüyük veri yığını için zaman aşımı istisnası atar bkz:

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

Benim çözümüm, HttpStackkendi setReadTimeout()politikamla genişleyen bir sınıf yaratmak . Sonra RequestQueueaşağıdaki gibi oluştururken kullanın :

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

1

Ben bir yöntemi ekleyerek sona erdi setCurrentTimeout(int timeout)için RetryPolicyve içinde 's uygulanmasını DefaultRetryPolicy.

Sonra setCurrentTimeout(int timeout)Request sınıfına bir ekledim ve çağırdım.

Bu işi yapıyor gibi görünüyor.

Bu arada tembellik için üzgünüm ve açık kaynak için yaşasın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.