在ArrayList中创建和删除(回收)位图时,堆大小不断增加

时间:2012-04-27 06:48:23

标签: android bitmap arraylist touchstart

我正在创建一个将位图存储在数组列表或数组中的应用程序。我在清单中设置了android:largeHeap="true"以增加应用程序的内存大小。我正在创建20位图,然后如果创建新位图,第一个位图被回收(删除),新的位图将被添加到数组列表中。每当我添加一个额外的位图时,它会释放内存,但在接下来的15到20(总共超过35)之后,位图堆大小增加了大约20到25 MB。此过程继续,并发生内存不足异常。空间没有释放。我已经按顺序单独尝试了以下各项:

  1. 回收位图
  2. 指定null
  3. 从arraylist中删除
  4. 问题仍然存在。

    ArrayList<Bitmap> linesbitmap;
    
    private void touch_start(float x, float y) { // function called on every touch
        if (index >= 19) {
            while (linesbitmap.size() >= 19) {
                linesbitmap.get(0).recycle();
                linesbitmap.remove(0);
            }
            System.gc();
            System.runFinalization();
            System.gc();
        }
        if (mBitmap != null) {
            linesbitmap.add(Bitmap.createBitmap(mBitmap));
        }
        index = linesbitmap.size();
    }
    

2 个答案:

答案 0 :(得分:3)

在数组列表或数组中创建和删除位图时,堆大小会增加。我已将位图转换为ByteArrayOutputStream并将其存储在数组列表中。当我们删除或添加ByteArrayOutputStream的新对象时,堆大小不会像存储和删除多个位图时那样增长。

ArrayList<ByteArrayOutputStream> arraylist=new ArrayList<ByteArrayOutputStream>();
new Thread(new Runnable() {
    @Override
    public void run() {
        Bitmap bitmap = Bitmap.createBitmap(mBitmap);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        if (mBitmap != null) {
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            arraylist.add(out);
        }
    }
}).start();

答案 1 :(得分:0)

从问题来看,您似乎使用ArrayList作为缓存机制。如果是这种情况,您可以查看API级别12中引入的LruCache,但也包含在旧API级别的兼容包中。