gpt4 book ai didi

java - 干净的内部类实现 Runnable

转载 作者:行者123 更新时间:2023-12-02 03:12:39 25 4
gpt4 key购买 nike

我有一个用于 CustomView 的类,它必须内部类,两者都实现 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 的 Activity 被销毁时,它们是否会自动被销毁?

干杯

最佳答案

它不会被破坏而导致内存泄漏,因为您的线程将对您的 View 以及您的 Activity 有一个强引用。

将内部类设为静态并在 run 方法中保留对所需变量的弱引用。

您可以做的第二件事是中断您的线程,当您查看从窗口分离并检查运行方法是否线程被中断时,尽管如果您的线程没有做太多工作,则没有必要。

这是您的可运行程序的外观

private static class AutoDecrementer implements Runnable {

AutoDecrementer (ValueSelector valueSelector ){
this.weakRef = new WeakReference<>(valueSelector);
}


@Override
public void run() {
ValueSelector valueSelector = (ValueSelector )weakRef.get();
if(valueSelector == null){
return ;
}

if (valueSelector.minusButtonIsPressed) {
valueSelector .decrementValue();
valueSelector .mHandler.postDelayed(new AutoDecrementer(), REPEAT_INTERVAL_MS);
} else {
valueSelector.mHandler.removeCallbacks(this);
Thread.currentThread().interrupt();
}
}
}

我没有检查任何错误。

关于java - 干净的内部类实现 Runnable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40811785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com