Залповая утечка памяти при запросах HEAD

Относительно Volley library для Android:

Если я сделаю много запросов HEAD, мое устройство быстро исчерпает память. Причина, по которой это происходит, заключается в том, что Volley выделяет память на основе Content-Length даже в запросах HEAD, например, в строке 212 BasicNetwork.java.

новый PoolingByteArrayOutputStream(mPool, (int) entity.getContentLength());

Что я делаю:

RequestQueue mRequestQueue = Volley.newRequestQueue(this);
for(link : various_links_of_mp3_files){
    StringRequest req = new StringRequest(Method.HEAD, URL, null);
    mRequestQueue.add(req)

Кто-нибудь испытывает ту же проблему? Это баг или только моя вина? Заранее спасибо.


person ADD    schedule 21.04.2014    source источник
comment
как вы обрабатываете ответы на ваши запросы? Я также пытаюсь использовать Method.HEAD, но всегда получаю сообщение об ошибке (в частности, com.android.volley.NoConnectionError: java.io.EOFException), даже если URL-адрес правильный.   -  person Stéphane Péchard    schedule 28.05.2014


Ответы (1)


Мне удалось исправить это самостоятельно, это ошибка библиотеки. Если у кого-то возникла такая же проблема, вам необходимо добавить следующий дополнительный оператор IF в строку 110 документа BasicNetwork.java

// If request method is HEAD, there is no need to allocate
// memory
if (request.getMethod() == Request.Method.HEAD) {
     responseContents = new byte[0];
}
// Some responses such as 204s do not have content. We must
// check.
else if (httpResponse.getEntity() != null) {
    responseContents = entityToBytes(httpResponse.getEntity());
} else {
    // Add 0 byte response as a way of honestly representing a
    // no-content request.
    responseContents = new byte[0];
}

При этом Volley больше не выделяет память Content-Length. В любом случае спасибо, если кто-то пытался мне помочь безрезультатно.

person ADD    schedule 08.05.2014