Java 删除位图时出错[Android]

Java 删除位图时出错[Android],java,android,bitmap,Java,Android,Bitmap,我正在开发一个简单的应用程序,可以在屏幕上绘制小位图,但在清除屏幕时有点困难。我的位图存储在一个名为_graphics的ArrayList中,我需要清除屏幕,所以我要清除ArrayList。这可以很好地清除屏幕,但是过了一段时间我的应用程序强制关闭 如果我在屏幕上绘制大约50个位图,第一次清除它时它将强制关闭,但是如果我只绘制5个位图,我可以在崩溃前清除大约10个位图。我认为这与GC没有正确清除位图有关。有人对此有什么想法吗?查看Logcat文件,我似乎发现了错误(新安卓开发人员:p甚至不知道它

我正在开发一个简单的应用程序,可以在屏幕上绘制小位图,但在清除屏幕时有点困难。我的位图存储在一个名为_graphics的ArrayList中,我需要清除屏幕,所以我要清除ArrayList。这可以很好地清除屏幕,但是过了一段时间我的应用程序强制关闭


如果我在屏幕上绘制大约50个位图,第一次清除它时它将强制关闭,但是如果我只绘制5个位图,我可以在崩溃前清除大约10个位图。我认为这与GC没有正确清除位图有关。有人对此有什么想法吗?

查看Logcat文件,我似乎发现了错误(新安卓开发人员:p甚至不知道它的存在)。这是因为ConcurrentModificationException。现在一切似乎都正常了=D

正常-现在堆栈跟踪已附加:ConcurrentModificationException 您可以从不同的线程修改ArrayList,或对其进行迭代。您必须同步访问或使用另一个集合,如ConcurrentHashSet

但也许以下(我的原始答案)也会很有趣:p

听起来,你正在用整个像素数据缓存真正的位图对象->我猜,你得到了OutOfMemoryException

垃圾收集器是一个异步操作,如果清除位图数组,位图不会立即从内存中卸载。如果插入新的,可能会发生,旧的仍在内存中,新的也会被加载

解决方案:不要以这种方式缓存位图

它们是不同的东西,你可以尝试(取决于你具体的场景):

1) 如果位图存储在SD卡或其他设备上,请仅缓存集合中位图的路径,并加载它们(如果绘图需要)

2) 使用可绘制对象而不是位图-他们有一些有趣的方法和算法来优化对位图数据的访问

3) 为了优化性能,可以使用类似的方法。软引用可以由GC按需卸载(当内存不足时)。在这种情况下,您必须检查软引用是null还是仍然存在。 例如:

ArrayList\u graphics=new ArrayList();
...
对于(int i=0;i<_graphics.size();i++)
{
位图b=_graphics.get(i.get();
如果(b==null)
{
b=某处的荷载(i);
_添加(新的软参考(b),i);
}
…用位图做点什么
}

此代码snipet未使用Java编辑器进行测试或编写(请原谅键入错误或错误的方法签名)。

您需要发送logcat输出。您可以这样做:2)使用可绘制对象而不是位图-他们有一些有趣的方法和算法来优化对位图数据的访问。你能详细说明这一点吗?
ArrayList<SoftReference<Bitmap>> _graphics = new ArrayList<SoftReference<Bitmap>>();
...

for (int i = 0; i < _graphics.size(); i++)
{
    Bitmap b = _graphics.get(i).get();
    if (b == null)
    {
        b = loadFromSomewhere(i);
        _graphics.add(new SoftReference<Bitmap>(b), i);
    }
    ... do something wwith your bitmap
}