我有一個CustomView類具有內部類,都實現了Runnable在單獨的線程中執行一個任務。清潔內部類實現Runnable
public class ValueSelector extends LinearLayout{
.....
private class AutoIncrementer implements Runnable {
@Override
public void run() {
if (plusButtonIsPressed) {
incrementValue();
mHandler.postDelayed(new AutoIncrementer(), REPEAT_INTERVAL_MS);
} else {
mHandler.removeCallbacks(this);
Thread.currentThread().interrupt();
}
}
}
private class AutoDecrementer implements Runnable {
@Override
public void run() {
if (minusButtonIsPressed) {
decrementValue();
mHandler.postDelayed(new AutoDecrementer(), REPEAT_INTERVAL_MS);
} else {
mHandler.removeCallbacks(this);
Thread.currentThread().interrupt();
}
}
}
}
如何正確清理它們? 當託管這些CustomView的活動被破壞時,它們是否會自動銷燬?
乾杯
他們永遠不會被「摧毀」。在Java變得無法訪問之後,它會在垃圾回收一段時間之後收集垃圾,與Java中的任何其他對象實例一樣。在這種情況下,這可能會在線程停止運行後一段時間。 – Andreas
正常的內部類包括對頂級類的隱式引用,因此當活動被銷燬時仍然會引用該引用,並且gc不會清除此問題,因此需要使內部類爲靜態,並且還使用weakreference並對長時間運行的作業使用線程處理程序,並使用runOnUiThread方法你可以更新你的UI –