0

我正在尝试为每个主屏幕设置不同的壁纸,但我遇到了 OutOfMemory 问题。我有 5 个位图,我试图将其覆盖在 5 倍于显示宽度的壁纸位图上。使用下面的代码我得到 OOM。问题似乎是创建大壁纸位图的第一行代码。我的问题是是否有办法做到这一点(即以某种方式占用更少的内存,或者以某种方式分配更多的内存??)。谢谢!

 Bitmap wallpaper = Bitmap.createBitmap(displayWidth*5,displayHeight, Config.ARGB_8888);
 Canvas canvas = new Canvas(wallpaper);
 Uri data = getIntent().getData();
 Bitmap bmp = getBitmap(data, imagePosition, displayWidth, displayHeight);
 canvas.drawBitmap(bmp, 0, 0,null);
 WallpaperManager wallpaperManager = (WallpaperManager) SetterActivity.this.getSystemService(Context.WALLPAPER_SERVICE);
 wallpaperManager.setBitmap(wallpaper);
 wallpaperManager.suggestDesiredDimensions(bmp.getWidth()*2, bmp.getHeight());
4

2 回答 2

0

如果您无法一次加载 5 个屏幕的图像,您可以尝试一次只加载一个,并根据当前正在查看的主屏幕进行切换。

也就是说,您在内存中有 2 个位图,一个是current,一个是next。在第一个视图上加载current位图。用于onOffsetsChanged确定滚动发生的时间,然后next根据接下来显示的主屏幕加载位图。您需要自己进行从屏幕 A 到 B 的插值。滚动完成后,回收current并另存nextcurrent.

我敢肯定,这个实现中存在一些我现在没有想到的问题,但是你只会用这种方法分配 2 个位图。祝你好运!

于 2010-08-16T18:47:48.297 回答
0

位图数据在本机堆中分配(有关详细信息,请参阅BitmapFactory OOM 让我发疯)。有多少可用取决于平台(例如,API 级别 2.2 有 24M 本机堆总数),但除此之外没有办法增加它。分配多少本机堆空间取决于您和其他应用程序对位图/图形的操作。

您的第一行代码/壁纸位图只有 480 * 800 * 32 / 8 = 1.536 MB,这完全在最大值之内。因此,当您到达那条线时,似乎已经分配了大部分堆?

请注意,本机堆被垃圾收集但很少 - 如果应用程序没有显式释放它,则不会恢复数据。因此,如果您在没有回收位图的情况下运行应用程序(在 onDestroy 中),您可能会在几次运行后耗尽本机堆。

于 2011-03-30T22:53:48.233 回答