Android游戏开发中MediaPlayer播放音频仅45秒停止如何解决?
问题根源
你在onCreate方法中声明的MediaPlayer属于局部变量,onCreate执行完成后该变量就失去了强引用,会被Android系统的垃圾回收机制自动回收,自然就会中断播放。你遇到的45秒停止刚好是常规的垃圾回收触发周期,和音频文件本身无关。
修复方案
你已经在MainActivity类中声明了MediaPlayer bkgrdmsc成员变量,直接将MediaPlayer实例赋值给该成员变量即可,不要在onCreate中创建独立的局部MediaPlayer变量。修改后的代码如下:
package com.example.androidstudio2dgamedevelopment; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.media.MediaPlayer; import android.view.WindowManager; /** * Main Activity is the entry point to our application */ public class MainActivity extends Activity { private int width; private int height; // 用成员变量持有MediaPlayer实例,避免被GC回收 MediaPlayer bkgrdmsc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 直接给成员变量赋值,不要创建局部的mediaPlayer变量 bkgrdmsc = MediaPlayer.create(this, R.raw.fg); bkgrdmsc.setLooping(true); bkgrdmsc.start(); //Set Window to fullscreen (will hide status bar) Window window = getWindow(); this.width = 240; this.height = 240; //Set Content view to game, so that objects in the Game Class can be rendered to the screen setContentView(new Game(this)); } // 补充生命周期处理,避免内存泄漏和后台异常 @Override protected void onPause() { super.onPause(); if(bkgrdmsc != null && bkgrdmsc.isPlaying()){ bkgrdmsc.pause(); } } @Override protected void onResume() { super.onResume(); if(bkgrdmsc != null && !bkgrdmsc.isPlaying()){ bkgrdmsc.start(); } } @Override protected void onDestroy() { super.onDestroy(); if(bkgrdmsc != null){ bkgrdmsc.release(); bkgrdmsc = null; } } }
补充说明
- 成员变量会伴随Activity的完整生命周期存在,只要Activity没有被销毁,MediaPlayer实例就不会被提前回收,循环播放逻辑可以正常生效
- 新增的生命周期处理逻辑可以避免应用退到后台时仍占用音频焦点,同时防止Activity销毁时MediaPlayer资源泄漏
内容的提问来源于stack exchange,提问作者NaoyaShinota
相关产品推荐
相关产品推荐

