倒计时结束播放自定义音效问题求助:onCreate无法返回选中值
解决倒计时结束播放选中自定义音效的问题
核心问题梳理
onCreate是void类型方法,不能返回值,你最后一行return selection[0];是语法错误,必须删除。- 你在
onCreate里定义的selection是局部变量,loadMusic方法无法访问它,需要把它提升为类的成员变量。 loadMusic里的playSound方法硬编码了R.raw.sound2,没有使用用户选中的音效ID,且内部调用逻辑混乱(Runnable传R.raw.sound1但方法里未使用)。MediaPlayer播放后未释放资源,易引发内存泄漏。
修复后的完整代码
首先在类中声明成员变量,让整个类的方法都能访问选中的音效ID:
public class Sound extends AppCompatActivity { // 成员变量保存选中的音效ID,可设置默认值 private int selectedSoundId = R.raw.sound1; private ImageButton imageButton1; // 假设你的TimerStatus是自定义枚举 private TimerStatus timerStatus; // ... 其他类成员 ...
修改onCreate方法,删除错误的return语句,正确保存用户选择的音效ID:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sound); imageButton1 = findViewById(R.id.iv_bowl1); imageButton1.setOnClickListener(v -> { // 绑定按钮对应的音效ID selectedSoundId = R.raw.sound1; Toast.makeText(Sound.this, "已选择音效1", Toast.LENGTH_SHORT).show(); }); // 其他音效按钮的逻辑示例 // ImageButton imageButton2 = findViewById(R.id.iv_bowl2); // imageButton2.setOnClickListener(v -> { // selectedSoundId = R.raw.sound2; // Toast.makeText(Sound.this, "已选择音效2", Toast.LENGTH_SHORT).show(); // }); }
最后修改loadMusic方法,使用选中的音效ID播放,并处理资源释放:
private void loadMusic() { if (timerStatus == TimerStatus.PAUSED) { new Runnable() { @Override public void run() { playSound(selectedSoundId); } private void playSound(int soundResId) { MediaPlayer mp = MediaPlayer.create(getBaseContext(), soundResId); if (mp != null) { mp.start(); // 播放完成后自动释放资源,避免内存泄漏 mp.setOnCompletionListener(mediaPlayer -> mediaPlayer.release()); } } }.run(); } }
额外说明
- 确保布局文件
sound.xml中存在对应的控件ID(如iv_bowl1)。 - 根据你的实际业务逻辑调整
timerStatus的判断条件(比如倒计时结束时应将状态设为FINISHED,则判断条件改为timerStatus == TimerStatus.FINISHED)。 - 新增音效按钮时,只需复制点击事件逻辑,修改对应的
selectedSoundId即可。
内容的提问来源于stack exchange,提问作者rico
相关产品推荐
相关产品推荐

