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;
}