我正在我的应用中的4个不同位置设置帮助屏幕图像。活动代码如下 -
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.help_list);
int screenType = getIntent().getIntExtra("screenName", 0);
ImageView imageView = (ImageView) findViewById(R.id.help_image);
switch (screenType) {
case 1:
imageView.setImageResource(R.drawable.help0);
break;
case 2:
imageView.setImageResource(R.drawable.help1);
break;
case 3:
imageView.setImageResource(R.drawable.help2);
break;
case 4:
imageView.setImageResource(R.drawable.help3);
break;
}
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
此代码在大多数设备上成功执行,但在某些设备上(例如Samsung),应用程序因内存不足而崩溃。
我试图回收Bitmap -
BitmapDrawable bitmapDrawable = ((BitmapDrawable) imageView.getDrawable());
if (bitmapDrawable != null) {
bitmapDrawable.getBitmap().recycle();
}
但是上面的代码总是在bitmapDrawable
的值中给出null。如何修复此OutOfmemory异常?
P.S。图像绘制的最大尺寸为80kb
答案 0 :(得分:2)
图像的像素大小是多少?由于图像存储在Java堆中,因此不会压缩它们。这意味着位图的每个像素最多可占用堆中的32位= 4个字节。 因此,对于尺寸为1920 x 1080的图像(也许您还针对大分辨率平板电脑),即:
string query = "Select * FROM Customers INNER JOIN ..."; //you have to pass sql query
MySqlDataAdapter da = new MySqlDataAdapter();
da.SelectCommand = query;
...
现在在平板电脑上可能没问题,但是在可能有64 MB堆空间的旧手机上,您可能很容易遇到OutOfMemoryExceptions。
那你能做什么?
如果您只定位手机,可以将图片尺寸调整为更小的尺寸吗?这主要是基于反复试验,也取决于图像的使用情况(模糊背景图像VS具有重要细节的地图图像)。
使用不同的位图配置。默认值为1920 x 1080 x 4 bytes = 8294400 bytes, 8.29 megabytes.
,每个通道为8位(ARGB)= 32位。如果您不需要Alpha通道(透明度),并且图像不一定非常高质量,那么您应该尝试RGB_8888
。它的质量下降非常小,但几乎不明显。作为回报,它消耗了一半的内存(5 + 6 + 5 =每像素16位)。
最重要的修复:您可以为不同的屏幕密度提供不同的图像。所以这是一个例子。让我们说我们想要使用计算中的FullHD图片。 对于较小的屏幕,我们将其缩小,节省内存。有一些工具可以根据不同的密度缩小图像,请参阅this question。 遵循密度指南,您可以将以下图像放在给定目录中:
因此,虽然图像在大型平板电脑上占用了8.29 Mb的堆空间,但在旧款手机上只占用921 Kb,这正是我们想要的。 它确实带来了增加APK大小的成本,因为现在它包含4张图片而不是1张。
答案 1 :(得分:0)
我认为您的问题描述得很好here
或者您可以通过photoshop将图像尺寸更改为50x50等。