排球库中的等待请求功能存在问题。调试使我进入java.util中的AbstractQueue类,其中添加了一个元素(根据方法中的一些值指示成功添加到队列中)并同时 - 不添加(根据队列中的0个元素) - 不改变它们的价值)。添加方法是同步的。贝娄,你可以找到目前为止的情况和我的研究的详细描述。如果你看看它们并分享,如果你知道发生了什么,我将非常感激。
我尝试在任何类型的错误时自动重试请求(例如 - 当没有连接或服务器名称不正确时)。 请求的错误处理程序将请求添加回我的应用程序的静态单例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);
}
这种方法不起作用,当在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的offer(E e)方法中,程序的执行在第453行停止。
l452 siftUpUsingComparator(n, e, array, cmp);
l453 size = n+1;
显然返回的值为true,但未添加元素。我的调试器无法进入添加元素的方法 - siftUpUsingComparator(n,e,array,cmp);
我将在重试我的请求之前添加一个计时器,并将构建一个新计时器。所以我对解决方法并不感兴趣,我想了解在这种情况下发生了什么以及如何发生。你对这背后的原因有什么想法吗?
答案 0 :(得分:1)
问题是您尝试再次将相同的Request实例添加到已添加到的队列中。这会混淆队列和请求本身,因为它有状态。例如,如果您只是启用标记,则会发生崩溃。解决方案是使用默认重试策略或克隆请求。