2015-12-15 21 views
0

如果使用View.postDelayed()我會知道,重複呼叫Handler.postDelayed()(再次調用postDelayed()在同一個runnable中)可能會導致線程永遠不會釋放一些實例。如果使用View.postDelayed()

如果我使用View.postDelayed()添加一個可運行的程序,我是否負責調用View.removeCallbacks()以避免內存泄漏?或者當視圖被「銷燬」時,runnable會從隊列中移除嗎?

回答

0

或者當視圖爲 「已銷燬」時,可運行列表是否會從隊列中刪除?

這是你的責任。 runnable將掛在隊列中,直到你明確地刪除它或執行它(runnable不會將它自己發佈到隊列中)。我強烈建議你致電removeCallbacks。如果你是子類視圖,你可以使用onDetachedFromWindow()

+0

感謝您的答案,onDetachedFromWindow()是偉大的。現在我可以讓我的一些代碼更加優雅。我有另一個問題:我寫一個util類來做一些動畫到任意視圖,並在Activity.onDestroy()中調用stopAnim()方法來刪除可運行子( 「顯式刪除它」)。但我認爲讓util類的用戶明確地執行發佈工作有點難看。有沒有辦法知道何時不再使用視圖? – Lyux

+0

我找到了一個方法,但不知道它是否合適。在Runnable.run()的開始處,嘗試使用View.getWindowToken()獲取窗口標記。如果爲null,則退出循環。爲我工作到目前爲止。 – Lyux

+0

*有沒有辦法知道什麼時候不再使用視圖?*如果你是子類視圖,你應該使用'onDetachedFromWindow()'去除/註銷 – Blackbelt