在我的android应用程序中,我必须不断创建Bitmaps,这是代码:
@Override
protected byte[] getTile(int level, int col, int row) {
double[] bbox = getBBOX(level, col, row);
byte[] res = Util.getBitMapByteArray(bbox);
return res;
}
public static byte[] getBitMapByteArray(double[] bbox) {
Bitmap map = MapEngine.GetBitMap(bbox);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
map.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
我在触发getTile
时遇到错误,我的应用程序将退出当前活动并返回上一个活动:
12-10 10:25:43.424: A/libc(12035): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 12035 (droidPlatEngine)
12-10 10:25:43.424: A/libc(12035): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 12102 (Thread-4336)
MapEngine.GetBitMap
将从本机库调用本机方法。
由于方法getTile
的调用是由我无法控制的其他组件(它可能从多个线程调用该方法)所以我尝试将synchronized
关键字添加到这两个方法中:
@Override
protected synchronized byte[] getTile(int level, int col, int row) {
double[] bbox = getBBOX(level, col, row);
byte[] res = Util.getBitMapByteArray(bbox);
return res;
}
public static synchronized byte[] getBitMapByteArray(double[] bbox) {
Bitmap map = MapEngine.GetBitMap(bbox);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
map.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] byteArray = stream.toByteArray();
return byteArray;
}
现在,我的应用程序可能会运行一段时间,但在某些时候仍然会再次出现相同的错误。
然后我尝试使用DDMS来查看发生了什么,这是堆对话框:
此外,我发现如果我继续按下cause GC
按钮,我的应用程序将会运行很长时间,如果我停止按下该按钮,则退出到之前的活动。
现在我不确定这是由线程或内存,我的java代码还是本机库引起的。
任何人都可以告诉我如何继续?