वॉली टाइमआउट अवधि बदलें


190

मैं अपने सर्वर से अनुरोध करने के लिए एंड्रॉइड के लिए नए वॉली फ्रेमवर्क का उपयोग करता हूं। लेकिन यह प्रतिक्रिया मिलने से पहले समय बिताता है, हालांकि यह प्रतिक्रिया करता है।

मैंने इस कोड को जोड़ने की कोशिश की:

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

में HttpClientStackएक अलग पूर्णांक (50000) के लिए वॉली ढांचे की, लेकिन यह अभी भी 50 सेकंड पहले बाहर गुना।

क्या टाइमआउट को लंबे मूल्य में बदलने का कोई तरीका है?



21
@AdamStelmaszczyk - यह एक डुप्लिकेट नहीं होगा क्योंकि यह वॉली ढांचे में विशिष्ट विवरण के बारे में है। HttpClientकक्षा के उपयोग के बारे में संदर्भित SO प्रश्न ।
माइकल बॅनजॉन

जवाबों:


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

क्या आप यह भी जानते हैं कि अनुरोध की प्राथमिकता कैसे तय की जाती है?
मार्कस

2
@ मर्कस ने 'सामान्य' के अलावा कुछ वापस करने के लिए Request.getPriority () को ओवरराइड किया। ImageRequest यह करता है। नोट: आपको इसे अलग SO प्रश्न में पूछना चाहिए।
लार्हम 1

1
यह वही है जो मैं वॉली को अपने अनुरोध को छोड़ने से रोकने के लिए देख रहा था जो 15 सेकंड लेता है। - थैंक्स!
slott

मैंने इसे पोस्टआउट के लिए टाइमआउट पर निष्क्रिय करने के अनुरोधों के लिए जोड़ा है। यह अविश्वसनीय रूप से गलत है कि Google डेवलपर्स ने POST अनुरोधों पर एक पुनः प्रयास नीति निर्धारित करने का निर्णय लिया है। मेरा मुद्दा हल किया। धन्यवाद।
नीतिवचन

1
@ Roon13 नमूना अनुरोध निर्माता को देखें जो अभी जोड़ा गया था।
लार्हम 1

226

Android वॉली टाइमआउट को संभालने के लिए आपको उपयोग करने की आवश्यकता है RetryPolicy

RetryPolicy

  • वॉली आपके अनुरोधों के लिए अपने रिट्रीपोलिस को लागू करने का एक आसान तरीका प्रदान करता है।
  • वॉली सभी अनुरोधों के लिए डिफ़ॉल्ट सॉकेट और ConnectionTImeout से 5 सेकंड के लिए सेट करता है।

RetryPolicy एक इंटरफ़ेस है जहाँ आपको अपने तर्क को लागू करने की आवश्यकता होती है कि कैसे आप एक विशेष अनुरोध को पुनः प्राप्त करना चाहते हैं जब एक टाइमआउट होता है।

यह इन तीन मापदंडों से संबंधित है

  • टाइमआउट - प्रत्येक रिट्री प्रयास में मिली में सॉकेट टाइमआउट निर्दिष्ट करता है।
  • रिट्रीट की संख्या - कई बार रिट्री का प्रयास किया जाता है।
  • बैक ऑफ मल्टीप्लायर - एक मल्टीप्लायर जो प्रत्येक रिट्री प्रयास के लिए सॉकेट के लिए घातीय समय निर्धारित करने के लिए उपयोग किया जाता है।

पूर्व के लिए। यदि इन मूल्यों के साथ RetryPolicy बनाया जाता है

टाइमआउट - 3000 एमएस, रिट्री अटेम्प्ट्स की संख्या - 2, बैक ऑफ मल्टीप्लायर - 2.0

प्रयास 1:

  • समय = समय + (समय * वापस गुणक);
  • समय = 3000 + 6000 = 9000 मी
  • सॉकेट टाइमआउट = समय;
  • अनुरोध 9 सेकेंड के सॉकेट टाइमआउट के साथ भेजा गया

प्रयास 2:

  • समय = समय + (समय * वापस गुणक);
  • समय = 9000 + 18000 = 27000 मी
  • सॉकेट टाइमआउट = समय;
  • अनुरोध 27 सेकेंड के सॉकेट टाइमआउट के साथ भेजा गया

तो रिट्री अटेम्प्ट 2 के अंत में अगर सॉकेट टाइमआउट होता है तो वॉली 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कार्यान्वयन वास्तव में क्या करता है , इस पर विस्तृत जवाब के लिए धन्यवाद ।
dbm

5
अच्छा उत्तर @Yakiv Mospan. लेकिन आपके उदाहरण पर, पहले प्रयास का समय 3000 + (3000 * 2) के बजाय 0 + (3000 * 2) है। और दूसरा एक 6000 + (3000 * 2)।
13KZ

13KZ, मेरा मानना ​​है कि आप अभी भी समय की गणना के बारे में गलत हैं, मेरा संपादन देखें और वॉली स्रोत के खिलाफ सत्यापित करें
प्रोटॉन्गुन

1
इसका उपयोग करने वाले लोगों के लिए बस एक अनुस्मारक: हमेशा उपयोग करें new DefaultRetryPolicy(और सुनिश्चित करें कि किसी वस्तु का पुन: उपयोग न करें RetryPolicy, क्योंकि ऑब्जेक्ट को सभी अनुरोध प्रक्रिया के माध्यम से संदर्भित किया जाता है, और उसी ऑब्जेक्ट टाइमआउट मान पर पुनर्प्रयास वेतन वृद्धि को जोड़ा जाता है, इस प्रकार आपके भविष्य के अनुरोध का समय असीम रूप से बढ़ जाता है।
आईजी पास्कल

कनेक्शन हैंडशेक टाइमआउट कैसे है?
GMsoF

23

बस मेरे दृष्टिकोण के साथ योगदान करने के लिए। जैसा कि पहले ही उत्तर दिया गया है,RetryPolicy है। लेकिन अगर आपको अपने सभी अनुरोधों के लिए डिफ़ॉल्ट की तुलना में अलग नीति की आवश्यकता है, तो आप इसे आधार अनुरोध वर्ग में सेट कर सकते हैं, इसलिए आपको अपने सभी अनुरोधों के लिए नीति सेट करने की आवश्यकता नहीं है।

कुछ इस तरह:

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

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

मेरे मामले में मेरे पास एक GsonRequest है जो इस BaseRequest से निकलता है, इसलिए मैं किसी विशिष्ट अनुरोध के लिए नीति सेट करने के लिए भूलने के जोखिम को नहीं चलाता और यदि कुछ विशिष्ट अनुरोध की आवश्यकता हो तो भी आप इसे ओवरराइड कर सकते हैं।


1
यह सही काम करना चाहिए? setRetryPolicy (नया 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 के रूप में सेट कर सकते हैं। जो कुछ भी आप इसे सेट करना चाहते हैं वह मिलीसेकंड में है। 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));


2

वैकल्पिक समाधान यदि उपरोक्त सभी समाधान आपके लिए काम नहीं कर रहे हैं

डिफ़ॉल्ट रूप से, वॉली ने दोनों के लिए 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)अनुरोध कक्षा में एक जोड़ा और उसे बुलाया।

यह काम करने के लिए लगता है।

जिस तरह से और खुले स्रोत के लिए हुर्रे मेरे आलस्य के लिए क्षमा करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.