Android MediaPlayer封装方法后点击按钮音效重复播放问题
问题原因
核心原因是Java的参数传递为值传递,针对引用类型的参数,方法接收的是原引用的内存地址副本,而非原引用本身,你在方法内部对参数本身的赋值不会作用到外部的原始变量。
具体到你的代码逻辑:
- 最初直接在
playSound中操作类属性_standBy时,赋值操作修改的是类本身的成员变量,下次调用判断时可以读取到上一次创建的MediaPlayer实例,因此正在播放时不会重复创建,符合需求。 - 抽离为
customizeSound方法后,你传入的_standBy只是把自身的地址值复制给了方法内的局部变量mediaplayer:- 当你在方法内执行
mediaplayer = MediaPlayer.create(_context, R.raw.turbine)时,只是修改了这个局部临时变量的指向,类成员变量_standBy本身没有任何改动,始终保持初始的null值 - 因此每次调用
customizeSound时,mediaplayer == null的判断永远为真,每次都会重新创建实例播放,就出现了点击就重复播放的问题。
- 当你在方法内执行
修复方案
最简便的改造是让customizeSound返回处理后的MediaPlayer实例,调用时重新赋值给类属性即可,修改后代码如下:
// 方法返回值改为MediaPlayer private MediaPlayer customizeSound(MediaPlayer mediaplayer) { if (mediaplayer == null || !mediaplayer.isPlaying()) { mediaplayer = MediaPlayer.create(_context, R.raw.turbine); mediaplayer.start(); } return mediaplayer; } private void playSound() { // 接收返回值重新赋值给类属性 _standBy = customizeSound(_standBy); }
内容的提问来源于stack exchange,提问作者xRay
相关产品推荐
相关产品推荐

