Android 处理大位图(平铺小位图以创建壁纸)

Android 处理大位图(平铺小位图以创建壁纸),android,memory,views,bitmap,Android,Memory,Views,Bitmap,我的内存有问题,我想这可能与创建大型位图有关 手头的任务是获得一个相当小的平铺图像,创建一个较大的平铺图像,并将其设置为手机壁纸。我这样做的方式是: 1) 创建一个2*屏幕宽度、1*屏幕高度的视图 2) 将视图背景设置为BitmapDrawable,并将平铺模式设置为repeat 3) 使用视图尺寸创建位图 4) 通过:view.draw(新画布(位图))将视图绘制到位图 5) 设置wallpper:getApplicationContext().setWallpaper(位图) 这在我的手机(

我的内存有问题,我想这可能与创建大型位图有关

手头的任务是获得一个相当小的平铺图像,创建一个较大的平铺图像,并将其设置为手机壁纸。我这样做的方式是:

1) 创建一个2*屏幕宽度、1*屏幕高度的视图

2) 将视图背景设置为BitmapDrawable,并将平铺模式设置为repeat

3) 使用视图尺寸创建位图

4) 通过:view.draw(新画布(位图))将视图绘制到位图

5) 设置wallpper:getApplicationContext().setWallpaper(位图)

这在我的手机(HTC Magic)和其他我试过的手机上都很好用。但是我收到了关于这个问题的错误报告。我试图通过将所需尺寸加倍来重现问题,问题似乎发生在将视图绘制到位图的第4步:

错误/dalvikvm堆(124):需要堆消息(7372800字节外部分配太大)

我不知道如何着手解决这个问题。请帮忙!
谢谢

我相信你已经考虑过了,不过:你包括在内了吗

<uses-permission android:name="android.permission.SET_WALLPAPER" />

在你的清单文件里


你确定没有引发异常吗?展示祝酒词可能会有问题。

不确定这是否是您的解决方案,但您看过吗

您使用它的方式是:


BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
Bitmap bitmap_origin = BitmapFactory.decodeFile(path, options);

不幸的是,我认为你做不了什么。。。我们在这里用手机;Android Limb是16MB的进程内存

以下是我可以给你的一些提示和技巧(因为我的应用程序中有相同的问题)

  • 您确定需要32位像素吗?这是三个8位彩色通道加上一个8位alpha通道。您可以使用RGB_565获得视觉上可接受的结果

  • 回收创建位图时不需要的图像(以及不需要绘制位图的图像)

  • null
    您不需要的任何其他对象

  • 在创建
    位图之前运行强制垃圾收集


希望这有帮助

实际上,您可以重构代码。如果不使用
视图

  • 创建所需大小的
    Bitmap
    Bitmap=Bitmap.createBitmap(宽度、高度、Bitamp.Config.RGV_565)
    (或
    ARGB_8888
    ,这可能也适用)
  • 创建
    canvas=新画布(位图)
  • src
  • 简化代码:

    // set another matrix if you want rotation/scaling of the input
    Matrix identity=new Matrix(); 
    for (int i=0; i<maxLines; i++) {
      for (int j=0; j<maxCol; j++) {
        canvas.draw(src, identity,anyPaint);
      }
    }
    
    //如果要旋转/缩放输入,请设置另一个矩阵
    矩阵恒等式=新矩阵();
    
    对于(int i=0;iYes我有,它可以在我的手机和其他各种我试过的手机上使用。为了复制错误,我做的是将图像放大,事实上,试图为位图分配太多内存是一个问题。我将更改问题以反映这一点。另外一个不好的提示是:不要使用图像大于需要:-)谢谢,但我已经尝试了所有这些,但仍然会不时收到用户报告的问题…也许你是对的,这可能只是移动设备的限制,而且在使用位图的任何地方都必须优化所有内容。谢谢你刚刚尝试了这一点,这似乎是个好主意。很难看出它的区别有多大由于这个问题一开始在我的手机上并没有发生太多,所以我怀疑它会对内存造成多大影响。无论如何,谢谢!在您的代码中,还有一些类似identity.setTranslate(patternWidth*i,patternHeight*j)的内容在每次绘图调用之前都必须添加。由于Android 4.0,有更好的调试可能性,因为用于位图分配的内存现在正确地列为DDMS中堆监视器中使用的内存。4.0之前,用于位图分配的内存没有显示在堆监视器中,因此人们只能猜测ch内存在实际中使用。也许这有助于您更好地调试代码。