【问题标题】:out of memory issue with volley's disk cache凌空的磁盘缓存内存不足问题
【发布时间】:2014-06-12 09:55:55
【问题描述】:

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

当我多次刷新(删除所有项目并加载 tiems)列表视图时, 我的应用被这条消息杀死了

我该如何解决?

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): | group="main" 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 句柄=2102160344 04-26 13:08:01.038: I/dalvikvm(18040): |状态=R schedstat=(109248225 27367764 57) utm=9 stm=1 核心=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): 在 com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526) 04-26 13:08:01.038: I/dalvikvm(18040): 在 com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549) 04-26 13:08:01.038: I/dalvikvm(18040): 在 com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392) 04-26 13:08:01.038: I/dalvikvm(18040): 在 com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155) 04-26 13:08:01.038: I/dalvikvm(18040): 在 com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84) 04-26 13:08:01.048: W/dalvikvm(18040): threadid=299: 线程以未捕获的异常退出 (group=0x41745da0) 04-26 13:08:01.048: I/SpenGestureManager(847): setFocusWindow0 04-26 13:08:01.048:D/PointerIcon(847):setHoveringSpenIconStyle1 指针类型:10001iconType:1 标志:0 04-26 13:08:01.048: D/PointerIcon(847): setHoveringSpenCustomIcon IconType 相同.1 04-26 13:08:01.048:E/AndroidRuntime(18040):致命异常:线程 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): 在 com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:316) 04-26 13:08:01.048: E/AndroidRuntime(18040): 在 com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:526) 04-26 13:08:01.048: E/AndroidRuntime(18040): 在 com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:549) 04-26 13:08:01.048: E/AndroidRuntime(18040): 在 com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:392) 04-26 13:08:01.048: E/AndroidRuntime(18040): 在 com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:155) 04-26 13:08:01.048: E/AndroidRuntime(18040): 在 com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84) 04-26 13:08:01.058: W/ActivityManager(847): 强制完成活动 com.android.myapp/.feedlist.Feedlist

【问题讨论】:

  • 有什么解决办法吗?
  • 这个问题已经快 2 年了,但我仍在寻找解决方案。 This question 类似,但答案对我不起作用。 OP,你有没有想过?

标签: android caching memory android-volley


【解决方案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

这会改变缓存大小

【讨论】:

    【解决方案2】:

    我在将图像加载到 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 2015-10-01
      • 2016-06-12
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2013-12-26
      相关资源
      最近更新 更多