[英]Clean Inner Class implementing Runnable
我有一个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被销毁,将导致错误。 为了避免这种情况,请对某些对象使用WeakReference,以减小值。 但是,通常,将UI和一些ligic混合使用是不好的做法,因为这很难测试。 考虑使用rxJava库,这看起来像
Subscriptioin s = Observable.just(100, TimeUnit.Milliseconds)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.computation())
.subscribe(t -> decrementValue());
在您的onPause()方法中,通过以下方式取消该活动
if (s != null && !s.inUnsubscribed()) {
s.unsubscribe();
s = null;
}
它不会被破坏而导致内存泄漏,因为您的线程将对您的视图以及您的活动有强烈的引用。
将内部类设为静态,并弱引用run方法中所需的变量。
您可以做的第二件事是中断线程,当您查看从窗口中分离出来并检查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();
}
}
}
我没有检查任何错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.