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