当前位置:  开发笔记 > 编程语言 > 正文

Volley库中的等待请求功能问题(PriorityBlockingQueue.java)

如何解决《Volley库中的等待请求功能问题(PriorityBlockingQueue.java)》经验,为你挑选了0个好方法。

我在排球库中的等待请求功能有问题.调试使我进入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 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);

我将在重试我的请求之前添加一个计时器,并将构建一个新计时器.所以我对解决方法并不感兴趣,我想了解在这种情况下发生了什么以及如何发生.你知道这背后的原因是什么?

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有