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

在Jetpack Compose中创建MediaPlayer的OnCompletionListener遇问题求助

解决MediaPlayer OnCompletionListener的返回值错误问题

你写的trackDone函数声明要返回(MediaPlayer) -> Unit类型(也就是一个接收MediaPlayer参数的函数),但函数体里根本没返回符合要求的内容,这就是报错的原因。

给你两种解决办法:

方案一:直接用Lambda简化实现

没必要单独写trackDone函数,设置监听器时直接传Lambda就行,这也是Kotlin里最常用的写法:

mediaPlayer.setOnCompletionListener { mp ->
    mp.stop()
    mp.release()
    // 别忘了更新UI,比如把播放状态切回false
    isPlaying = false
}

方案二:修正trackDone函数的返回值

如果一定要保留这个函数,得让它返回一个符合要求的函数类型,改成这样:

fun trackDone(): (MediaPlayer) -> Unit {
    return { mp ->
        mp.stop()
        mp.release()
        // 这里加UI更新逻辑
    }
}

// 使用的时候
val onCompletionListener = MediaPlayer.OnCompletionListener(trackDone())
mediaPlayer.setOnCompletionListener(onCompletionListener)

或者更简洁的函数表达式写法:

fun trackDone() = { mp: MediaPlayer ->
    mp.stop()
    mp.release()
    // UI更新逻辑
}

另外提两个关键注意点:

  • isPlaying必须用mutableStateOf声明,不然状态变化不会触发Compose的UI重组:
    var isPlaying by remember { mutableStateOf(false) }
    
  • 要注意MediaPlayer的资源泄漏问题,建议用DisposableEffect在Composable销毁时释放资源:
    DisposableEffect(Unit) {
        onDispose {
            if (mediaPlayer.isPlaying) {
                mediaPlayer.stop()
            }
            mediaPlayer.release()
        }
    }
    

内容的提问来源于stack exchange,提问作者AndyMo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:50:31