【问题标题】:Android - A different Bitmap wallpaper for every home screen - OutOfMemoryAndroid - 每个主屏幕都有不同的位图壁纸 - OutOfMemory
【发布时间】:2010-07-23 12:08:42
【问题描述】:

我正在尝试为每个主屏幕设置不同的壁纸,但我遇到了 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());

【问题讨论】:

  • 您的位图尺寸是多少?
  • 好吧,我在 Nexus One 上进行测试,它的屏幕尺寸为 480x800。首先,我创建了 5 倍大 (2400x800) 的壁纸位图。然后对于每个主屏幕,我将在尺寸为 480x800 的 Canvas 上绘制另一个位图。
  • displayWidth 和 displayHeight 的值是多少?它们是固有的宽度和高度吗? ( myBitmap.getIntrinsicWidth() , myBitmap.getIntrinsicHeight();)
  • 显示为 480x800px。我在 5 个主屏幕上分别设置了 5 个 480x800(内部尺寸)位图。
  • 嘿,您最终找到解决方案了吗?

标签: java android bitmap out-of-memory wallpaper


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    位图数据在本机堆中分配(详见BitmapFactory OOM driving me nuts)。有多少可用取决于平台(例如,API 级别 2.2 有 24M 本机堆总数),但除此之外没有办法增加它。分配多少本机堆空间取决于您和其他应用程序对位图/图形所做的工作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多