2015-12-22 79 views
5

我在排球庫中的等待請求功能存在問題。調試將我引向了java.util中的AbstractQueue類,在該類中添加了一個元素(根據方法中指示隊列成功添加的某些值),同時又不添加(根據隊列中的0個元素 - 不會改變它們的值)。添加方法是同步的。貝婁,你可以找到一個詳細的情況描述和我的研究到目前爲止。我會非常感謝你看到他們,分享你是否有什麼想法。Volley庫中的等待請求功能問題(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,因爲reuqest的cacheKey存在於mWaitingRequests Map中。所以請求被添加到mWaitingRequests映射中的隊列中,對應於它的鍵。當先前請求完成 - 儘管這些線在請求隊列類正在執行的新的一個不被添加到隊列:

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(java.util中的類)元素正在添加到隊列中,「修改」值爲true,但在整個洞時間,「this」參數繼續包含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的程序的執行的要約(E E)方法終止於線453

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

顯然返回的值是真實的,但不添加的元素。我的調試器無法進入添加元素的方法 - siftUpUsingComparator(n,e,array,cmp);

我將在重試我的請求之前添加一個計時器,並將構造一個新計時器。所以我對解決方案並不感興趣,我想了解在這種情況下發生了什麼以及如何發生。你有什麼想法可能是背後的原因?

回答

1

問題是您嘗試再次將相同的請求實例添加到已添加到的隊列中。這與隊列和請求本身混亂,因爲它具有狀態。例如,如果你只是啓用標記,你就會崩潰。解決方案是隻使用默認重試策略或克隆請求。