Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我所有的位图都要上采样200%?_Android_Memory Management_Bitmap_Out Of Memory_Heap - Fatal编程技术网

Android 为什么我所有的位图都要上采样200%?

Android 为什么我所有的位图都要上采样200%?,android,memory-management,bitmap,out-of-memory,heap,Android,Memory Management,Bitmap,Out Of Memory,Heap,我的应用程序中存在严重的内存问题[1]。为了调查这一点,我在不同的州对我的应用程序进行了大量的测试。我看到一些位图占用了大量内存。我编写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),这样我就可以看到位图,并将它们与我的res/drawable文件夹中的文件进行比较 我发现我所有的文件都上采样了两次。 我首先检查了最大的一个:堆中有一个超过9MB的字节数组缓冲区,它被解码为一个漂亮的1920x1280图片,而原始的是一个960x640 png文件。 我试着用第二大的,超过

我的应用程序中存在严重的内存问题[1]。为了调查这一点,我在不同的州对我的应用程序进行了大量的测试。我看到一些位图占用了大量内存。我编写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),这样我就可以看到位图,并将它们与我的
res/drawable
文件夹中的文件进行比较

我发现我所有的文件都上采样了两次。
我首先检查了最大的一个:堆中有一个超过9MB的字节数组缓冲区,它被解码为一个漂亮的1920x1280图片,而原始的是一个960x640 png文件。
我试着用第二大的,超过3MB的,解码后显示了一张漂亮的754x1200图片,原来的尺寸是。。。你猜怎么着?一个漂亮的377x600 jpg文件

有什么好处

我已经在我的Android清单文件中启用了硬件加速功能(虽然我不确定我是否真的需要它,但我只是在使用一些基本视图和活动)。
我在GSM Galaxy Nexus(yakju)上运行股票Android 4.0.2。我收到了测试人员的反馈,他们的4.0.3 Nexus S上存在这个问题,尽管我还不能检查他们的堆转储

我试图在这里节省内存,如果Android将所有内存加倍,难怪应用程序会很快崩溃,因为堆使用率太高(在我的例子中约为64MB)。我希望这是有原因的,也有解决的办法

参考资料:


  • 当您将图像放入
    res/drawable
    中时,Android将假定它们的dpi为160,即,这与将图像放入
    res/drawable mdpi
    中相同。Galaxy Nexus是一款xhdpi设备,即(通用)dpi为320。为了补偿高分辨率显示,Android将以200%的比例对图像进行上采样

    解决方案很简单,只需将图像放在
    res/drawable xhdpi
    中即可。然后,声明的图像dpi将与您运行的显示器匹配,Android不会对图像执行任何缩放


    有关更多信息,请参阅。

    在设置样本大小和解码图像时,您应该发布代码。这将提供有关此行为的更多信息。这可能是ICS的问题。我只是在放大几个图像视图。检查链接[1]如果您需要查看一些代码,一切都在那里。好的,我明白了。问题是,我正在开发的应用程序包含数百张图片,当我说他需要以另一种分辨率处理所有图片时,客户不会喜欢。我会找到一个简单的方法,但是非常感谢你帮助我!将大图片移动到可绘图的xhdpi消除了所有内存问题,我的内存低于40MB,而在此之前我的内存超过60MB。非常感谢。