很久没更新了,今天悄悄更新一下。
最近某熊找到了一份做手机开发的工作,目前主要是做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... }
就是这样:-)
Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.12) Gecko/20100907 Fedora/3.5.12-1.fc12 Firefox/3.5.12
堆,栈,哦哦~~
Mozilla/5.0 (Windows NT 6.1; rv:2.0) Gecko/20100101 Firefox/4.0
为什么是在栈上呢
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
错误没有愚蠢与不愚蠢之分
Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.16) Gecko/20110323 Ubuntu/10.04 (lucid) Firefox/3.6.16
没有人吗?
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.24
噗。。查BUG查半天发现自己很愚蠢的事情经常会发生的。。
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
噗哈哈哈哈哈哈~~ 栈是不需要GC的~
你那个AsyncPlayer对象没绑到全局变量,是个野对象,无论是在栈还是在堆,它都只是昙花一现。