【问题标题】:Volley framewok request keeps objects in memoryVolley 框架请求将对象保留在内存中
【发布时间】:2014-11-10 04:38:29
【问题描述】:

我以这种方式提出截击请求:

   public void makeRequest(BaseRequest request, Response.Listener<JSONObject> responseListener,
                            Response.ErrorListener errorListener) {
        if (Constants.DEBUG) Log.i(TAG, "Sending: " + request.getUrlRequest());
        JsonObjectRequest jsObjRequest = new JsonObjectRequest(METHOD, request.getUrlRequest(), null, responseListener, errorListener);
        // disable cache
        jsObjRequest.setShouldCache(false);
        jsObjRequest.setTag(mTag);
        mQueue.add(jsObjRequest);
    }

mTag 是一个类类型。我有一个活动,在它的 onCreate 方法上我用这个来调用凌空请求:

mVolleyManager.makeRequest(getRequest(), new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            refreshLayout.setRefreshing(false);
            onEndLoading(response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            refreshLayout.setRefreshing(false);
            onErrorLoading(error);
        }
    });

如果我开始打开和关闭活动一段时间,我的内存会不断增长,直到达到 OOM 错误。我试着用 MAT 看看,结果如下:

似乎 Volley 将所有请求都保存在内存中,即使正确调用了 onResponse 方法也是如此。我已经通过改用改造解决了这个问题。相同的代码,相同的请求并且它正在工作,但我想了解我的问题可能是什么原因。

【问题讨论】:

  • 你使用单例队列吗?
  • 天哪.. 我想实现它,但在这种特殊情况下,我没有使用单例。这可能是问题所在,对吧?

标签: android android-volley android-networking


【解决方案1】:

NetworkDispatcher 默认只有 4 个 threads,所以我认为您的问题是由创建多个请求队列和旧线程未杀死造成的,请使用单例队列,以供参考:

http://developer.android.com/training/volley/requestqueue.html

每个请求队列只有 4 个线程,但在您的图像中我可以看到超过 4 个,因此很明显您的问题是由于不使用单例设计模式引起的。

【讨论】:

  • 我会试试的,我会告诉你的
  • 好吧,我的错!非常感谢!
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多