2015-12-22 10 views
5

के भीतर प्रतीक्षा अनुरोध कार्यक्षमता समस्या मुझे वॉली लाइब्रेरी में प्रतीक्षा अनुरोध कार्यक्षमता के साथ कोई समस्या है। डिबगिंग ने मुझे जावा.यूटिल में एबस्ट्रक्वियू क्लास में ले जाया जहां एक तत्व जोड़ा जा रहा है (विधि में कुछ मूल्यों के मुताबिक जो कतार में सफल जोड़ दर्शाता है) और साथ ही - जोड़ा नहीं जा रहा है (कतार में 0 तत्वों के अनुसार - जो उनके मूल्य को नहीं बदलते हैं)। जोड़ने की विधि सिंक्रनाइज़ है। भाई आप अब तक स्थिति और मेरे शोध का एक विस्तृत विवरण पा सकते हैं। यदि आप कोई विचार करते हैं कि क्या हो रहा है, तो आप उन्हें देखकर साझा करेंगे और साझा करेंगे।वॉली लाइब्रेरी (PriorityBlockingQueue.java)

मैं किसी भी प्रकार की त्रुटि पर अनुरोधों को स्वचालित रूप से पुनः प्रयास करने का प्रयास करता हूं (उदाहरण के लिए - जब कोई कनेक्शन नहीं है, या सर्वर का नाम सही नहीं है)। अनुरोध के त्रुटि हैंडलर अनुरोध को वापस मेरे ऐप के स्थिर सिंगलटन RequestQueue में जोड़ता है।

RetriableRequestWraper.java

m_request = new StringRequest(
      method, 
      url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        handleResponse(response); 
       } 
      }, 

      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError volleyError) { 
        handleError(volleyError); 
       } 
      }); 

public void handleError(VolleyError volleyError) 
{ 
    Log.d("Request: ", m_request.toString()); 
    Log.d("handleError: ", volleyError.toString()); 
    if(retriesCount<3) 
    { 
     executeRequest(); 
     ++retriesCount; 
    } 
    else 
    { 
     retriesCount = 0; 
    } 
} 

public void executeRequest() 
{ 
    RequestsManager.getInstance().executeRequest(m_request); 
} 

public void executeRequest(Request request) 
{ 
    Log.d("executeRequest ","m_requestQueue.add(request)"); 
    m_requestQueue.add(request); 
} 

RequestManager.java

public void executeRequest(Request request) 
{ 
    Log.d("executeRequest ","m_requestQueue.add(request)"); 
    m_requestQueue.add(request); 
} 

यह दृष्टिकोण काम नहीं करता है और जब मैं बिंदु जहां अनुरोध करने के लिए जोड़ा नहीं जा सका करने के लिए आ वॉली पुस्तकालय के अंदर डिबगिंग RequestQueue क्लास का mCacheQueue, क्योंकि reweqest का कैशकी mWaitingRequests मानचित्र में मौजूद है। इसलिए अनुरोध mwaitingRequests मानचित्र में कतार में जोड़ा गया है, इसकी कुंजी के अनुरूप है। जब पिछले अनुरोध समाप्त हो गया है - नया एक कतार में जोड़ा नहीं है, हालांकि इन पंक्तियों RequestQueue कक्षा में निष्पादित किया जा रहा:

synchronized(this.mWaitingRequests) { 
      String cacheKey1 = request.getCacheKey(); 
      Queue waitingRequests1 = (Queue)this.mWaitingRequests.remove(cacheKey1); 
      if(waitingRequests1 != null) { 
       if(VolleyLog.DEBUG) { 
        VolleyLog.v("Releasing %d waiting requests for cacheKey=%s.", new Object[]{Integer.valueOf(waitingRequests1.size()), cacheKey1}); 
       } 

       this.mCacheQueue.addAll(waitingRequests1); 
      } 
     } 

आगे इस लाइन

this.mCacheQueue.addAll(waitingRequests1); 

AbstractQueue में डिबगिंग है। जावा (java.util में वर्ग) तत्व कतार में जोड़ा जा रहा है, "संशोधित" मान सत्य है, लेकिन छेद के दौरान "इस" पैरामीटर में 0 तत्व होते हैं।

public boolean addAll(Collection<? extends E> c) { 
    if (c == null) 
     throw new NullPointerException("c == null"); 
    if (c == this) 
     throw new IllegalArgumentException("c == this"); 
    boolean modified = false; 
    for (E e : c) 
     if (add(e)) 
      modified = true; 
    return modified; 
} 

PriorityBlockingQueue.java कार्यक्रम के निष्पादन की विधि प्रस्ताव (ई ई) के अंदर लाइन 453.

l452 siftUpUsingComparator(n, e, array, cmp); 
l453 size = n+1; 

जाहिर दिए गए मान सच है पर बंद हो जाता है, लेकिन तत्व नहीं जोड़ा गया है। मेरा डीबगर उस विधि में नहीं जा सका जो तत्व जोड़ता है - siftUpUsingComparator (n, e, array, cmp);

मैं अपना अनुरोध पुनः प्रयास करने से पहले एक टाइमर जोड़ने जा रहा हूं, और एक नया निर्माण करूंगा। इसलिए मुझे वास्तव में कामकाज में दिलचस्पी नहीं है, मैं समझना चाहता हूं कि इस स्थिति में क्या और कैसे हो रहा है। क्या आपको कोई विचार है कि इसके पीछे क्या कारण हो सकता है?

उत्तर

1

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

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