2016-01-29 21 views
15

मेरे पास एक रेट्रोफिट नेटवर्क कॉल है जो आईडी हर 5 सेकंड को चलाने की तरह है। मेरे वर्तमान कोड:रेट्रोफिट "IllegalStateException: पहले ही निष्पादित"

Handler h = new Handler(); 
int delay = 5000; //milliseconds 

h.postDelayed(new Runnable() { 
    public void run() { 
     call.enqueue(new Callback<ApiResponse>() { 
      @Override 
      public void onResponse(Response<ApiResponse> response) { 
       Log.d("api", "response: " + response.body().getPosition().getLatitude().toString()); 
      } 

      @Override 
      public void onFailure(Throwable t) { 

      } 
     }); 
     h.postDelayed(this, delay); 
    } 
}, delay); 

यह एक बार चलाता है, लेकिन उसके बाद निम्न फेंकता है:

java.lang.IllegalStateException: पहले से ही मार डाला। retrofit2.OkHttpCall.enqueue (OkHttpCall.java:52) retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.enqueue पर (ExecutorCallAdapterFactory.java:57) orbyt.project.MyFragment $ 1.run पर पर (MyFragment.java:93)

क्या यहाँ मुद्दा?

बोनस के रूप में: इसे संभालने का बेहतर तरीका क्या है? मैं हर अद्यतन एक नक्शा अद्यतन कर रहा हूँ। मैं आरएक्स का उपयोग करने की कोशिश करने के बारे में सोच रहा था लेकिन यह सुनिश्चित नहीं है कि यह उचित उपयोग-मामला है, या इसे कैसे कार्यान्वित किया जाए।

+0

क्या यह संभव है कि आपका नेटवर्क कॉल 5 सेकंड से अधिक समय ले रहा है, इसलिए जब दूसरा पुनरावृत्ति शुरू होता है तो पहला पुनरावृत्ति अभी तक समाप्त नहीं हुआ है? देरी से शुरू नहीं करता है जब पहली यात्रा समाप्त हो गया है, लेकिन समय से 5 सेकंड आप अच्छी तरह से पहली यात्रा – TooManyEduardos

+0

@TooManyEduardos कहा जाता है मैं एक तथ्य यह है क्योंकि मैं प्रतिक्रिया प्रवेश करने पहली कॉल को पूरा करने के लिए कर रहा है पता है, और यह तथ्य हो रही डेटा में हूँ। – Orbit

+0

लेकिन लॉग केवल आपके प्राप्त आंकड़ों से पता चलता है, न कि नेटवर्क कनेक्शन समाप्त हो गया। यह अभी भी 5 सेकंड विंडो के भीतर तत्व बंद हो सकता है। यह सिर्फ एक विचार है, लेकिन 15 सेकंड की तरह हैं और देखते हैं इस मुद्दे को दूर चला जाता है – TooManyEduardos

उत्तर

45

Call केवल एक बार उपयोग किया जा सकता है। Its documentation आपको बताता है कि एक से अधिक बार उपयोग करने के लिए:

उपयोग clone() एक ही वेब सर्वर पर एक ही मानकों के साथ कई कॉल करने के लिए; इसका उपयोग मतदान को लागू करने या असफल कॉल को पुनः प्रयास करने के लिए किया जा सकता है।

तो call.clone().enqueue(..) का उपयोग सुनिश्चित करें कि आप प्रत्येक अनुरोध के लिए एक ताजा, बेरोज़गार Call है।

+0

बहुत बढ़िया, धन्यवाद। – Orbit

संबंधित मुद्दे