1 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
MediaPlayer.create()
可能是一個(gè)相當(dāng)昂貴的電話??紤]一下如果大約需要 100 毫秒(甚至更多)會(huì)發(fā)生什么:
計(jì)時(shí)器調(diào)用
onTick()
。onTick()
內(nèi)部阻塞約 100 毫秒MediaPlayer.create()
。mp
開始播放,然后onTick()
返回。(到目前為止,一切都很好!)立即,計(jì)時(shí)器意識(shí)到另一個(gè)
onTick()
呼叫到期了!最后一個(gè)開始于 100 毫秒前!onTick()
幾乎立即再次調(diào)用。很快,它就接到了stopPlaying()
電話。但是您大約在 1 毫秒前才開始玩!
這會(huì)導(dǎo)致您的計(jì)時(shí)器將所有時(shí)間都花在 中MediaPlayer.create()
,而實(shí)際上幾乎沒(méi)有時(shí)間播放聲音。
請(qǐng)注意,使用編寫的代碼,它將嘗試在倒計(jì)時(shí)的最后 3 秒內(nèi)播放大約 30 次聲音(因?yàn)槔硐肭闆r下,滴答聲相隔 100 毫秒)。如果您的意圖是只播放 3 次聲音,您可能希望將第二個(gè)if
塊移動(dòng)到第一個(gè)塊內(nèi)。這樣,您僅在secondsLeft
實(shí)際更改時(shí)才嘗試播放。這實(shí)際上會(huì)改善最初的問(wèn)題,您可能不需要任何進(jìn)一步的更改。
但是如果你想進(jìn)一步優(yōu)化,請(qǐng)注意你可以mp
提前準(zhǔn)備——比如說(shuō),當(dāng)應(yīng)用程序啟動(dòng)時(shí)——然后簡(jiǎn)單地重復(fù)使用它:而不是release()
每次都 -ing 它,只是stop()
它,prepare()
它(而不是 reset()
它)。這將為下一場(chǎng)比賽做好準(zhǔn)備。您甚至可以為 單獨(dú)創(chuàng)建一個(gè)MediaPlayer
,beepend
并且可以在應(yīng)用程序初始化期間同時(shí)準(zhǔn)備它們。
添加回答
舉報(bào)