处理大位图的内存不足错误及Android活动生命周期问题

5
我有一个可滚动的地图应用程序,目前有一个巨大的位图。它在启动时加载得很好,但当它失去前台状态并且用户再次将其带回时,我会收到内存不足错误。在onPause中,它使用recycle来清除位图,并将其标记为null。 onResume检查map == null是否为真,然后再次加载位图,尽管我已经回收了位图,但这仍会导致程序崩溃...这是一些代码片段。 所有对Bitmap map的其他引用都会在加载/绘制之前首先检查它是否为空。

onPause

protected void onPause() {
super.onPause();
Log.e("sys","onPause was called");
if (map != null)
{
        map.recycle();
        map = null;
        System.gc();
        Log.e("sys","trashed the map");
}
}

my onResume

protected void onResume(){
super.onResume();
Log.e("sys","onResume was called");

if (map == null)
        map = BitmapFactory.decodeResource(getResources(),
                        R.drawable.lowresbusmap);
Log.e("sys","redrew the map");
}

你是在调试器中还是在真机上遇到这个错误? - EboMike
在真实的手机上(摩托罗拉Droid) - jfisk
1个回答

0

试试这种方式:

protected void onResume(){
    super.onResume();
    if (map == null){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inTempStorage = new byte[16*1024];

        map = BitmapFactory.decodeResource(getResources(),
                        R.drawable.lowresbusmap, options);
    }
}

很遗憾,这张图片实际上是为更快的手机设计的。像G1这样的较慢的手机将使用较小的位图。在这种情况下,我应该将16 * 1024更改为24 * 1024吗?不幸的是,那段代码仍然给我同样的错误。 - jfisk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接