gpt4 book ai didi

Android 应用程序在 Samsung Galaxy S3 上崩溃(内存不足错误)

转载 作者:可可西里 更新时间:2023-11-01 18:45:38 26 4
gpt4 key购买 nike

我有一个 Android 应用程序可以拍摄一些照片、调整它们的大小并将它们发送到后端服务器。此应用程序在所有其他手机( Gingerbread 和 Ice Cream Sandwich )上运行良好,但三星 Galaxy S3 除外。每当它拍摄照片并尝试调整其大小时,它就会耗尽内存。最初我认为这是调整大小部分的问题,我用 insamplesize 实现了位图对象并尝试了所有方法,但它仍然不断崩溃。然后我意识到当应用程序第一次启动时,它占用了大量内存。在 HTC 和所有其他手机上,当我的应用程序启动时,它使用了大约 4 MB,但在 Galaxy S3 上,它使用了大约 30 MG - 几乎是 10 倍。我似乎无法弄清楚是什么导致它用完那么多内存。我正在正确地回收所有对象和布局(我认为)。这是我必须调整图像大小的代码:

public static void resizeImage(String pathOfInputImage,
String pathOfOutputImage) {
try {
int inWidth = 0;
int inHeight = 0;
float factor;

InputStream in = new FileInputStream(pathOfInputImage);

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, options);
inWidth = options.outWidth;
inHeight = options.outHeight;

in.close();
in = null;

options = null;

if (inWidth > inHeight) {
factor = (float) inHeight / 480;
} else {
factor = (float) inWidth / 480;
}
options = new BitmapFactory.Options();

Bitmap roughBitmap;

if(Build.VERSION.SDK_INT < 12) {
System.gc();
}

try
{
in = new FileInputStream(pathOfInputImage);
options.inSampleSize = 4;
roughBitmap = BitmapFactory.decodeStream(in, null, options);
}
catch (OutOfMemoryError e)
{
roughBitmap = Utils.fetchRoughBitmap(pathOfInputImage, factor);
}
finally
{
roughBitmap = Utils.fetchRoughBitmap(pathOfInputImage, factor);
}

in.close();
in = null;

boolean rotate = false;
Bitmap rotatedBitmap = null;

if (isNeedToRotate(pathOfInputImage)) {
rotate = true;
Matrix m = new Matrix();

m.postRotate(90);
try
{
rotatedBitmap = Bitmap.createBitmap(roughBitmap, 0, 0,
roughBitmap.getWidth(), roughBitmap.getHeight(), m,
true);
}
catch (OutOfMemoryError e)
{
rotatedBitmap = Bitmap.createBitmap(roughBitmap, 0, 0,
roughBitmap.getWidth()/2, roughBitmap.getHeight()/2, m,
true);
}
}


if (rotate) {
Utils.log(TAG, "Rotate Invoked :------->");
int temp = inHeight;

inHeight = inWidth;
inWidth = temp;
}

options.inSampleSize = Math.round(factor);

float dstWidth = (int) inWidth / factor;
float dstHeight = (int) inHeight / factor;

Bitmap resizedBitmap;
if (rotate) {
try
{
resizedBitmap = Bitmap.createScaledBitmap(rotatedBitmap,
(int) dstWidth, (int) dstHeight, true);
}
catch (OutOfMemoryError e)
{
resizedBitmap = Bitmap.createScaledBitmap(rotatedBitmap,
(int) dstWidth/2, (int) dstHeight/2, true);
}

} else {

try
{
resizedBitmap = Bitmap.createScaledBitmap(roughBitmap,
(int) dstWidth, (int) dstHeight, true);
}
catch (OutOfMemoryError e)
{
resizedBitmap = Bitmap.createScaledBitmap(roughBitmap,
(int) dstWidth/2, (int) dstHeight/2, true);
}
}

try
{
FileOutputStream out = new FileOutputStream(pathOfOutputImage);
resizedBitmap.compress(Bitmap.CompressFormat.PNG, 80, out);
}
catch (Exception e) {
Utils.log("Image", e.getMessage() + e);
}

//Free up the memory.
roughBitmap.recycle();
resizedBitmap.recycle();

if (rotatedBitmap != null) {
rotatedBitmap.recycle();
}

} catch (IOException e) {
Utils.log("Image", e.getMessage() + e);
}
}


private static Bitmap fetchRoughBitmap(String pathOfInputImage, float factor)
{
Bitmap roughBitmap = null;
try
{
FileInputStream in = new FileInputStream(pathOfInputImage);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = Math.round(factor);
roughBitmap = BitmapFactory.decodeStream(in, null, options);
return roughBitmap;
}
catch (OutOfMemoryError mem_error)
{
return Utils.fetchRoughBitmap(pathOfInputImage, factor+1);
}
catch (FileNotFoundException e)
{
//return Utils.fetchRoughBitmap(pathOfInputImage, factor+1);
return roughBitmap;
}
}

这段代码工作正常,因为我通过递归循环运行它,直到它没有用完内存,但是我得到的图像只有大约 300x300 像素,我需要它至少是 640x480。我的问题是:

  1. 谁能告诉我为什么 Galaxy S3 在首次加载我的应用程序时使用高达 90% 的内存,而不是 HTC 手机上的 60%。
  2. 调整大小代码是否有任何错误导致我的应用内存不足。

任何帮助将不胜感激,因为我已经在这个问题上花了 3 天时间:-(。

最佳答案

嗯...我知道现在这是一个老问题,但这是我的想法。

Galaxy S3 使用 xhdpi 密度,因此在启动时分配更大的堆大小(据我所知,32mb)

但如果您的 res 目录中没有任何 xhdpi 资源,那么它将调用 drawable 中的任何默认图像或从最接近 xhdpi 密度的 hdpi 调用任何默认图像。

然后它会扩展图像以满足它的需要,在这个阶段扩展图像会占用大量内存,(可能)导致内存不足的问题。

您可以通过启用 Screen Compatibility Mode 来解决这个问题。 或者您可以创建(如果默认情况下不存在)drawable-xhdpi,提供 Appropriate Resources 适用于 xhdpi 设备,例如 Galaxy S3。

关于Android 应用程序在 Samsung Galaxy S3 上崩溃(内存不足错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908956/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com