com.android.volley.toolbox.DiskBasedCache.streamToBytes异常

最近使用volley加载网络图片,可是却时常发生以下问题:

EXCEPTION TYPE: java.lang.OutOfMemoryError EXCEPTION MSG: Failed to allocate a 1667591281 byte allocation with 4194304 free bytes and 296MB until OOM EXCEPTION STACK:
com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316)
com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526)
com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:548)
com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392)
com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155)
com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84)

解决办法:volley本来就不建议用来缓存太多的数据。遇到这种情况,目前的最好的解决方案貌似只有暴力清理缓存。
在获取请求队列的时候,拿到DiskBasedCache的引用,然后通过ClearCacheRequest来清理掉volley的缓存。

/**初始化*/
public void initImageLoader(){
    queue = getRequestQueue();
    if(imageLoader==null){
        //queue = Volley.newRequestQueue(mContext);
        imageLoader = new ImageLoader(queue, new BitmapCache());
    }
}
//volley默认的缓存放在/data/data/包名/cache/volley 下
private RequestQueue getRequestQueue() {
    if (queue == null) {
        queue = Volley.newRequestQueue(mContext);
    }
    File cacheDir = new File(mContext.getCacheDir(), "volley");
    DiskBasedCache cache = new DiskBasedCache(cacheDir);
    queue.start();

    // 清除所以volley缓存
    queue.add(new ClearCacheRequest(cache, null));
    return queue;
}

发表回复

后才能评论