gpt4 book ai didi

android - 在 Android 中第二次运行时导致 OutOfMemoryError 的 Animation Drawable

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:49 26 4
gpt4 key购买 nike

我目前正在开发一款游戏,我正在尝试使用一个 AnimationDrawable 在我的主菜单中显示一个动画。当我运行一次游戏时,它运行完美。但是,如果我点击后退按钮,当我再次打开游戏时,它会给我 OutOfMemoryError。如果我回家并返回游戏,它会加载但不显示动画,它应该在的地方是空的。

我想当它再次打开游戏时它会尝试加载动画,但它已经从上一次运行中加载了,我能以某种方式释放内存吗?我该如何处理该异常?

四处搜索我发现它是Android中的一个常见问题,但我找不到任何有用的东西。

如果相关的话,我的图像是 310x316,我有 114 帧要加载,动画是在 xml 中加载的。

我的 MainMenu 类:

public class MainMenuActivity extends Activity{

private String TAG = MainMenuActivity.class.getSimpleName();
ImageView rabbitMenu ;
AnimationDrawable ad;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.mainmenu);
rabbitMenu = (ImageView) findViewById(R.id.rabbitMenu);
rabbitMenu.setImageResource(R.drawable.rabbit_menu_animation);
ad = (AnimationDrawable) rabbitMenu.getDrawable();

}

public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
ad.start();

}
}

错误日志:

01-31 16:13:11.320: E/AndroidRuntime(19550): FATAL EXCEPTION: main
01-31 16:13:11.320: E/AndroidRuntime(19550): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
01-31 16:13:11.320: E/AndroidRuntime(19550): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
01-31 16:13:11.320: E/AndroidRuntime(19550): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:563)
01-31 16:13:11.320: E/AndroidRuntime(19550): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:439)

编辑:

在@OleGG 建议之后,现在第二次运行正常,但在第三次运行时,我显然是在尝试使用回收位图。

所以我放弃了使用AnimationDrawable,转而使用AsncTask来解决我的问题。现在,我不断更改 onProgressUpdate() 上 ImageView 的背景。可能不是最好的方法,但现在我没有任何问题!这是我的 AsyncTask 代码,以防有人遇到同样的问题!

private class DrawRabbit extends AsyncTask<Void, Integer, Void> {
private boolean running = true;
private int fps = 24;
private int frame = 10014;
private String drawableName;
@Override
protected Void doInBackground(Void... params) {


while (running){
try {
if (frame == 10014)
Thread.sleep(1000);
else
Thread.sleep(fps);
if (frame < 10160) {
frame++;
publishProgress(frame);
}
else
running = false;

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}

protected void onProgressUpdate(Integer... frame) {
drawableName = "rm" + frame[0];
int res_id = getResources().getIdentifier(drawableName, "drawable", getPackageName());
rabbitFrame.setBackgroundResource(res_id);
}
}

最佳答案

当您退出此屏幕时,您需要释放位图使用的内存。不幸的是,对于早期版本的 Android(据我所知,自 3.0 以来这是“固定的”,但我可能是错的)位图内存是通过 native 代码分配的,令人遗憾的是,应该显式释放内存。

所以,我想你可以试试这个方法:

  1. 将 AnimationDrawable 的代码移至 onResume() 方法。
  2. 在onPause()方法中添加如下代码释放内存。

    ad.stop();
    for (int i = 0; i < ad.getNumberOfFrames(); ++i){
    Drawable frame = ad.getFrame(i);
    if (frame instanceof BitmapDrawable) {
    ((BitmapDrawable)frame).getBitmap().recycle();
    }
    frame.setCallback(null);
    }
    ad.setCallback(null);

希望对你有帮助。

关于android - 在 Android 中第二次运行时导致 OutOfMemoryError 的 Animation Drawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082181/

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