android - 如何克服此问题 Caused by : java. lang.OutOfMemoryError: bitmap size exceeds VM budget

标签 android

我正在从 XML 解析图像并将其显示在我的 Android 应用程序中。我的问题是当解析超过 20 张图像时发生以下错误...

06-09 14:28:37.710: ERROR/AndroidRuntime(490): java.lang.RuntimeException: An error occured while executing doInBackground()
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at java.lang.Thread.run(Thread.java:1096)
06-09 14:28:37.710: ERROR/AndroidRuntime(490): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:459)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
06-09 14:28:37.710: ERROR/AndroidRuntime(490):     at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)

最佳答案

我曾经在为我制作的文件编辑器缩略图像时遇到过同样的问题。你想要做的是在将图像存储到内存之前缩小图像,并在读取它们后从系统内存中处理源图像

这是我用于我的代码,它将图像缩小到 110x110,但您可以设置自己的算法来缩放它(我相信 resizedbitmap 类中实际上已经有一个函数,但我还没有使用它)

public void setImageFromFile(String filename) {
    ImageView fileImage = (ImageView)findViewById(R.id.file_image_holder);
    Bitmap icon = BitmapFactory.decodeFile(filename);
    int width = icon.getWidth();
    int height = icon.getHeight();
    int newWidth = 110;
    int newHeight = 110;
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    Matrix bMatrix = new Matrix();
    bMatrix.postScale(scaleWidth, scaleHeight);

    Bitmap resizedBitmap = Bitmap.createBitmap(icon, 0, 0, width, height, bMatrix, true);
    BitmapDrawable bmd = new BitmapDrawable(resizedBitmap);
    fileImage.setImageDrawable(bmd);

}

关于android - 如何克服此问题 Caused by : java. lang.OutOfMemoryError: bitmap size exceeds VM budget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6294685/

相关文章:

java - 点击监听器的Android GridView 获取所选项目

android - 如何修复 "ADS AND CONTENT OVERLAP"

java - 如何从 HttpURLConnection 实例获取 HTTP 请求字符串

android - Google Play Store 是否向 "Beta App Update"发送 "Beta Testers"通知?

java - 由于 androidx drawerlayout 导致的错误

android - 如何制作可缩放的 ScrollView ?

安卓:开火xmpp

android - 提交到 SharedPreferences 变量

java - Android - 从另一个类调用时 MediaPlayer 不会释放

android - 捕获发送到 Google 语音识别服务器的音频