很久没更新了,今天悄悄更新一下。 最近某熊找到了一份做手机开发的工作,目前主要是做Android平台下的游戏。然后今天老大说要做一下播放BGM的实验。很快的,我写出了这样的代码: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new AsyncPlayer(“bgm”).play(getApplication(), Uri.fromFile(new File(“/sdcard/bgm.mp3″)), true, AudioManager.STREAM_MUSIC); //balabala… } 本来以为没问题的,但是测试的时候发现音乐播放个几十秒就停止了,找不出任何原因! 几乎调试、搜索了一个下午都是无解,就差认为Android有问题用硬件调试器了。后来用手机自带的硬件播放器听歌的时候看到日志上不断的在刷“mAudioStreamOut->write(40960 byte)” 之类的东西,终于明白了:因为AsyncPlayer对象是创建在栈上的!onCreate函数返回以后这个对象就会被GC了,能出声音才有鬼。于是马上修改代码证实了这个设想: AsyncPlayer bgm = new AsyncPlayer(“bgm”); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bgm.play(getApplication(), Uri.fromFile(new File(“/sdcard/bgm.mp3″)), true, AudioManager.STREAM_MUSIC); //balabala… } 就是这样:-)
