You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android MediaPlayer封装方法后点击按钮音效重复播放问题

问题原因

核心原因是Java的参数传递为值传递,针对引用类型的参数,方法接收的是原引用的内存地址副本,而非原引用本身,你在方法内部对参数本身的赋值不会作用到外部的原始变量。

具体到你的代码逻辑:

  1. 最初直接在playSound中操作类属性_standBy时,赋值操作修改的是类本身的成员变量,下次调用判断时可以读取到上一次创建的MediaPlayer实例,因此正在播放时不会重复创建,符合需求。
  2. 抽离为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:10