繁体   English   中英

Android:java.lang.OutOfMemoryError

[英]Android:java.lang.OutOfMemoryError

我需要在图像视图中显示动画。 为此,我使用了以下代码。 这是我的动画图像列表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)

有人可以帮帮我吗。

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

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

你能做什么? 您可以创建自己的动画机制,降采样,对位图使用其他格式(565而不是8888),并使用可以使用的最小内存,希望没有设备无法处理它。 您也可以要求操作系统为您提供更大的堆(使用largeHeap标志 ),但是,如果有的话,它可能无法为您提供所需的数量。

最小化位图上的内存占用空间是一种非常常见的解决方案,并且在Android平台中也非常需要,因为所有设备上的最小堆大小仍仅为16MB(但常见的更大)。 这是我对此发表的帖子

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM