我在排球库中的等待请求功能有问题.调试使我进入java.util中的AbstractQueue类,其中添加了一个元素(根据方法中的一些值指示成功添加到队列中)并同时 - 不添加(根据队列中的0个元素) - 不改变它们的价值).添加方法是同步的.贝娄,你可以找到目前为止的情况和我的研究的详细描述.如果你看看它们并分享,如果你知道发生了什么,我将非常感激.
我尝试在任何类型的错误时自动重试请求(例如 - 当没有连接或服务器名称不正确时).请求的错误处理程序将请求添加回我的应用程序的静态单例RequestQueue.
RetriableRequestWraper.java
m_request = new StringRequest( method, url, new Response.Listener() { @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); }
这种方法不起作用,当在volley库中调试时,我发现请求无法添加到RequestQueue类的mCacheQueue,因为reuqest的cacheKey存在于mWaitingRequests Map中.因此,请求将添加到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(java.util中的类)中,元素被添加到队列中,"modified"值为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;
显然返回的值为true,但不添加元素.我的调试器无法进入添加元素的方法 - siftUpUsingComparator(n,e,array,cmp);
我将在重试我的请求之前添加一个计时器,并将构建一个新计时器.所以我对解决方法并不感兴趣,我想了解在这种情况下发生了什么以及如何发生.你知道这背后的原因是什么?