繁体   English   中英

清洁内部类实现Runnable

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM