volley磁盘缓存的内存不足问题

时间:2014-04-26 17:20:15

标签: android caching memory android-volley

在我的Android应用中,我使用Volley在自定义列表视图中加载图片。

当我多次刷新(删除所有项目并加载tiems)listview时, 我的应用程序被此消息杀死

我该如何解决?

  

04-26 13:08:01.038:E / dalvikvm-heap(18040):1684947261字节分配的内存不足。   04-26 13:08:01.038:I / dalvikvm(18040):" Thread-11094" prio = 5 tid = 299 RUNNABLE   04-26 13:08:01.038:I / dalvikvm(18040):|基团="主" sCount = 0 dsCount = 0 obj = 0x439ea8e8 self = 0x7fb55250   04-26 13:08:01.038:I / dalvikvm(18040):| sysTid = 18946 nice = 10 sched = 0/0 cgrp = apps / bg_non_interactive handle = 2102160344   04-26 13:08:01.038:I / dalvikvm(18040):| state = R schedstat =(109248225 27367764 57)utm = 9 stm = 1 core = 2   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:~316)   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526)   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549)   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.toolbox.DiskBasedCache $ CacheHeader.readHeader(DiskBasedCache.java:392)   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155)   04-26 13:08:01.038:I / dalvikvm(18040):at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84)   04-26 13:08:01.048:W / dalvikvm(18040):threadid = 299:线程退出未捕获异常(组= 0x41745da0)   04-26 13:08:01.048:I / SpenGestureManager(847):setFocusWindow0   04-26 13:08:01.048:D / PointerIcon(847):setHoveringSpenIconStyle1 pointerType:10001iconType:1 flag:0   04-26 13:08:01.048:D / PointerIcon(847):setHoveringSpenCustomIcon IconType相同.1   04-26 13:08:01.048:E / AndroidRuntime(18040):致命异常:Thread-11094   04-26 13:08:01.048:E / AndroidRuntime(18040):进程:com.android.myapp,PID:18040   04-26 13:08:01.048:E / AndroidRuntime(18040):java.lang.OutOfMemoryError   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316)   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526)   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549)   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.toolbox.DiskBasedCache $ CacheHeader.readHeader(DiskBasedCache.java:392)   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155)   04-26 13:08:01.048:E / AndroidRuntime(18040):at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84)   04-26 13:08:01.058:W / ActivityManager(847):强制完成活动com.android.myapp / .feedlist.Feedlist

2 个答案:

答案 0 :(得分:1)

你试过吗

RequestQueue volleyQueue = Volley.newRequestQueue(this);
DiskBasedCache cache = new DiskBasedCache(getCacheDir(), 16 * 1024 * 1024);
volleyQueue = new RequestQueue(cache, new BasicNetwork(new HurlStack()));
volleyQueue.start();

来自

https://stackoverflow.com/a/21299261/3399432

这会更改缓存大小

答案 1 :(得分:1)

我在将图像加载到ListView时遇到了类似的问题。看来你必须自己处理缓存。

以下是我在public View getView(int position, View convertView, ViewGroup parent)适配器方法中的实现:

Bitmap cachedBitmap = imageCache.getBitmap(item.getPhotoUrl());
if (cachedBitmap != null)
{
    holder.photo.setImageBitmap(cachedBitmap);
}
else {
    ImageLoader imageLoader = new ImageLoader(Volley.newRequestQueue(this.context), imageCache);
    imageLoader.get(item.getPhotoUrl(), new ImageLoader.ImageListener() {
        @Override
        public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
            if (item.getPhotoUrl() != null && response.getBitmap() != null)
                imageCache.putBitmap(item.getPhotoUrl(), response.getBitmap());
        }

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    //This is a custom imageview, you can create your own implementation for loading the image url to the imageview
    holder.photo.setImageUrl(item.getPhotoUrl(), imageLoader);
}