cai*_*ci2 9 android android-animation android-layout
我正在开发一款游戏,我正在尝试使用一个AnimationDrawable在我的主菜单中显示一个动画.当我运行一次游戏时,它完美运行.但是如果我点击后退按钮,当我再次打开游戏时它会给我OutOfMemorryError.如果我回到家并回到游戏中,它会加载但不显示动画,它应该是空的.
我认为当它再次打开游戏时它会尝试加载动画,但它已经从上一次运行中加载了,我可以以某种方式释放该内存吗?我该怎么处理这个例外?
搜索我可以发现它是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();
}
}
Run Code Online (Sandbox Code Playgroud)
错误日志:
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)
Run Code Online (Sandbox Code Playgroud)
编辑:
在@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);
}
}
Run Code Online (Sandbox Code Playgroud)
Ole*_*eGG 22
当您退出此屏幕时,您需要释放位图使用的内存.不幸的是,对于Android的早期版本(afaik,这是3.0以来的"修复",但我可能是错的)位图的内存是通过本机代码分配的,可悲的是,内存应该被明确释放.
所以,我想你尝试这种方法:
添加以下代码以释放内存到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);
Run Code Online (Sandbox Code Playgroud)我希望它能帮到你.
| 归档时间: |
|
| 查看次数: |
11674 次 |
| 最近记录: |