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

倒计时结束播放自定义音效问题求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:15:45