提问者:小点点

Volley队列抛出OutOfMemoryError"pthread_create


每次我发出请求时,我都会创建一个新的Volley Request Queue:

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;

但是当我提出很多请求时,错误“抛出记忆错误”pthread_create“它被抛出。所以我在互联网上搜索,结论是只启动一次队列。

但是我的问题是,如果我不断创建新的队列,为什么内存会一直上升?我使变量为空,这样旧队列就无法访问,GC可以收集。还有其他东西持有队列吗?

注意对于上面的上下文,使用应用程序。

谢谢你们


共1个答案

匿名用户

我对这个问题的合理猜测是:

上下文:
您正在将应用程序上下文传递给队列。因此它将保留引用,直到应用程序存活。

代码

this.queue = null;

因为这段代码只会清除它持有的引用,而不是它占用的内存。从内存中清除它是GC的工作,你不能保证GC何时会调用。

为什么要为每个请求创建一个新的Request estQueue。您可以检查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);
}

资源:-理解上下文,理解参考