【问题标题】:Android:java.lang.OutOfMemoryError安卓:java.lang.OutOfMemoryError
【发布时间】:2025-12-10 13:05:01
【问题描述】:

我需要在图像视图中显示动画。为此,我使用了以下代码。这是我的动画图像列表 xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">

<item android:drawable="@drawable/read_by_myselfenglish_1" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_2" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_3" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_4" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_5" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_6" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_7" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_8" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_9" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_10" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_11" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_12" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_13" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_14" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_15" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_16" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_17" android:duration="210" />
<item android:drawable="@drawable/read_by_myselfenglish_18" android:duration="210" />

这是我的 android 活动类。

package com.www.froginthewhole;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

 public class MainClass extends Activity {

private AnimationDrawable frameAnimation;
    private ImageView view;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_class);

    view = (ImageView) findViewById(R.id.imageView1);
    view.setBackgroundResource(R.anim.home_book);    
    frameAnimation = (AnimationDrawable) view.getBackground();

    view.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
             frameAnimation.start();                
        }
    });
}

}

这里我需要在图像视图点击事件中更改图像。但不幸的是我得到了java.lang.OutOfMemoryError 运行时异常。我无法处理这个。这是我的日志。

12-03 20:18:58.492: E/AndroidRuntime(1187): java.lang.OutOfMemoryError
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.content.res.Resources.loadDrawable(Resources.java:1965)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.content.res.Resources.getDrawable(Resources.java:660)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:282)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:885)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.content.res.Resources.loadDrawable(Resources.java:1950)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.content.res.Resources.getDrawable(Resources.java:660)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.view.View.setBackgroundResource(View.java:14463)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at com.www.froginthewhole.MainClass.onCreate(MainClass.java:22)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.Activity.performCreate(Activity.java:5104)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.os.Looper.loop(Looper.java:137)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at android.app.ActivityThread.main(ActivityThread.java:5039)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at java.lang.reflect.Method.invokeNative(Native Method)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at java.lang.reflect.Method.invoke(Method.java:511)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-03 20:18:58.492: E/AndroidRuntime(1187):     at dalvik.system.NativeStart.main(Native Method)

谁能帮帮我。

【问题讨论】:

标签: java android


【解决方案1】:

内存不足是 Android 最常见的问题之一,因为设备具有不同的堆大小。小堆大小的原因是 Android 设计为即使在低端设备上也能运行。

由于您以本机形式 (java) 运行应用程序,因此它受堆大小的影响。

你能做什么?您可以创建自己的动画机制、下采样、使用不同的位图格式(565 而不是 8888),并尽可能使用最少的内存,希望没有设备无法处理它。你也可以要求操作系统给你一个更大的堆(使用largeHeap flag),但它可能不会给你你需要的数量,如果有的话。

最小化位图上的内存占用是一个非常常见的解决方案,并且在 Android 平台中非常需要,因为所有设备上的最小堆大小仍然只有 16MB(但常见的更大)。 here's a post 我已经做到了。

但是,最好不要使用原生形式的应用程序来处理大量位图,而是使用 C/C++ 或 openGL 解决方案。

对于 openGL 解决方案,您可以使用第三方库,例如 LibGDXAndEngine

如果您坚持使用原生形式的应用程序 (java),请让我们了解更多有关图像的信息(分辨率、文件类型以及放置位置)。重要的是要知道他们将使用多少内存,因为我认为正在发生的事情是 android 一次将所有图像加载到内存中。

【讨论】:

  • 我明白了。我从未使用过 OPENGL。是否支持动画。我只需要在 onclick 事件中更改图像视图中的图像。你有同样的一些示例教程链接吗?谢谢你的回答。
  • 您通常将 openGL 用于游戏和重型应用程序。如果您想要的只是带有动画的小按钮,则可以使用本机形式(java)。你能提供更多关于这些图像的信息以及你把它们放在哪里吗?也请重新阅读我的答案。我已经多次编辑了。
  • 我把图片放在drawable文件夹中。重要的是我需要像这样使用服务器动画。但是当我测试我的第一个动画时,我遇到了意外错误。你能建议我为此目的的好方法吗?
  • 内存泄漏是错误。您可以在任何平台和编程语言上发生内存泄漏。你的意思是内存不足的问题吗?如果是这样,现在它不取决于堆大小,而是取决于设备的真实内存(就像真实游戏的工作方式一样)。现在的大多数设备至少有 512 MB 的 RAM。我建议您始终在需要时加载和运行动画,并尽快处理它们。如果设备的屏幕无论如何都无法显示高质量的图像,还可以尝试缩小它们。当然,让动画的帧尽可能小。
  • 如果您使用原生表单,请在尽可能多的设备上测试您的应用,并始终检查应用占用了多少内存。想想如何处理堆太小的设备,这样用户就不会抱怨它崩溃了。