私は内部クラスにある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();
}
}
}
}
正しくクリーニングするにはどうすればよいですか? これらのカスタムビューをホストしているアクティビティが破棄されると、それらは自動的に破棄されますか?
乾杯
「破壊される」ことはありません。 Javaの他のオブジェクトインスタンスと同じように、到達不能になった後、ある時間ガベージコレクションが行われます。この場合、スレッドの実行が停止してからしばらく時間がかかるでしょう。 – Andreas
通常の内部クラスにはトップクラスへの暗黙の参照が含まれているので、アクティビティが破棄されても参照がそこに存在し、gcがこの問題を解決しない場合は、内部クラスを静的にしてweakreferenceを使用する必要があります。方法uはあなたのUIを更新することができます –