Здесь, в вашем блоке init
, вы заменили переданное в Activity новым экземпляром:
class MpPlayer(private var playerReference: MusicPlayer){
init{
playerReference = MusicPlayer()
}
Сначала удалите этот блок init
. Обратите внимание, что действия никогда не должны создаваться напрямую, потому что тогда они не будут настроены должным образом, чтобы иметь возможность использовать свой контекст. Кроме того, вам нужно разрешить Activity удалять себя в качестве слушателя при закрытии, поэтому сделайте свойство обнуляемым и установите для него значение null при уничтожении Activity. В противном случае ваш класс MPPlayer может попытаться обновить представления, когда Activity уже ушел, и он также будет пропускать Activity.
class MpPlayer(var playerReference: MusicPlayer?){
open class MusicPlayer : AppCompatActivity() {
//...
override fun onDestroy() {
super.onDestroy()
mp.playerReference = null
}
}
Я также отмечу, что передача Activity в musi c проигрыватель плохо использует инкапсуляцию. Вы тесно связываете эти два класса, как спагетти, когда игрок musi c должен иметь возможность работать независимо, не зная классов View. Я рекомендую создать класс прослушивателя для различных событий MusicPlayer и реализовать их в Activity, например:
class MpPlayer(var eventListener: EventListener?){
interface EventListener {
fun onPlayerPrepared(mediaPlayer: MediaPlayer)
fun onPlaybackCompleted(mediaPlayer: MediaPlayer)
//etc. anything views in Activity might want to respond to
}
fun loadMusic(url: String){
musicPlayer.apply {
reset()
setDataSource(url)
prepareAsync()
setOnPreparedListener { mp ->
eventListener?.onPlayerPrepared(mp)
}
setOnCompletionListener {
eventListener?.onPlaybackCompleted(mp)
skipNext()
}
}
}
}
Я также рекомендую поставить слово «Activity» в имени любого класса Activity, чтобы избежать путаницы.
class MusicPlayerActivity : AppCompatActivity(), MpPlayer.EventListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_musicplayer)
mp = MpPlayer(this)
mp.loadMusic()
}
override fun onPlayerPrepared(mediaPlayer: MediaPlayer){
totaltime = mp.duration
seekBar.max = totaltime
txt_musicName.text = playerReference.musicNameList[musicCounter]
txt_musicArtist.text = playerReference.musicArtistList[musicCounter]
btn_musicplayPause.setImageResource(R.drawable.ic_play)
//...
}
override fun onPlaybackCompleted(mediaPlayer: MediaPlayer) {
//...
}
override fun onDestroy() {
super.onDestroy()
mp.eventListener = null
}
}