0

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

  1. 回收位图
  2. 赋值为空
  3. 从数组列表中删除

问题仍然存在。

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();
}
4

2 回答 2

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();
于 2012-07-06T12:12:13.053 回答
0

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

于 2012-04-27T07:01:59.870 回答