Сброс очереди залпа из ошибки памяти «pthread_create» - PullRequest
0 голосов
/ 25 июня 2018

Каждый раз, когда я делаю запрос, я создаю новую очередь запросов на залп:

public void initializeQueue(Context context){

    File cacheDir = new File(context.getCacheDir(), "Volley");
    this.queue = new RequestQueue(new DiskBasedCache(cacheDir), new BasicNetwork(new HurlStack()), MAX_SIZE_THREAD_POOL);
    this.queue.start();
}

И когда я заканчиваю свой запрос, я очищаю переменную

this.queue = null;

Но когда я делаю много запросов, выдается ошибка «Throwing OutOfMemoryError« pthread_create ». Поэтому я искал в Интернете, и пришел к выводу, что очередь должна быть инициирована только один раз.

Но мой вопрос: почему память продолжает расти, если я постоянно создаю новые очереди? Я делаю переменную обнуляемой, чтобы старые очереди были недоступны и собирались GC. Что-то еще удерживает очередь?

Примечание Для контекста выше используется приложение.

Спасибо

1 Ответ

0 голосов
/ 25 июня 2018

Мое обоснованное предположение о проблеме будет:

Контекст: Вы передаете контекст приложения в очередь.Таким образом, он будет хранить ссылку до тех пор, пока приложение не станет активным.

Код

this.queue = null;

Поскольку этот код будет только очищать ссылку, которую он содержит, а не память, которую он занимает,Очистка из памяти его задания GC, и вы не можете гарантировать, когда GC вызовет.

Зачем вам нужно создавать новый запрос для каждого запроса.Вы можете проверить на null.создайте очередь и используйте эту же очередь для дальнейшей обработки.

File cacheDir = new File(context.getCacheDir(), "Volley");
if( this.queue == null ){
   this.queue = new RequestQueue(new DiskBasedCache(cacheDir), new BasicNetwork(new HurlStack()), MAX_SIZE_THREAD_POOL);
}

Ресурсы : - Понимание контекста , Понимание ссылки

...