2016-11-25 9 views
0

私は内部クラスにある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(); 
     } 
    } 
} 
} 

正しくクリーニングするにはどうすればよいですか? これらのカスタムビューをホストしているアクティビティが破棄されると、それらは自動的に破棄されますか?

乾杯

+0

「破壊される」ことはありません。 Javaの他のオブジェクトインスタンスと同じように、到達不能になった後、ある時間ガベージコレクションが行われます。この場合、スレッドの実行が停止してからしばらく時間がかかるでしょう。 – Andreas

+0

通常の内部クラスにはトップクラスへの暗黙の参照が含まれているので、アクティビティが破棄されても参照がそこに存在し、gcがこの問題を解決しない場合は、内部クラスを静的にしてweakreferenceを使用する必要があります。方法uはあなたのUIを更新することができます –

答えて

1

によってそのactioinを取り消し、これはあなたのonPause()メソッドで

Subscriptioin s = Observable.just(100, TimeUnit.Milliseconds) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.computation()) 
.subscribe(t -> decrementValue()); 

のようになります、rxJavaライブラリを使用することを検討してくださいあなたのビュー、そしてあなたの活動を参照してください。

実行メソッドで必要な変数に内部クラスを静的にし、弱参照を保持します。

2番目のことは、ウィンドウから切り離された状態を表示してスレッドが中断したかどうかをチェックするときにスレッドを中断させることです。ここで

は、あなたの実行可能な私はエラーがないかチェックしていません

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(); 
     } 
    } 
} 

どのように見えるかです。

+0

コードでどのように見えるのですか?私は内部クラスを静的にしていますが、ほとんどすべて静的にする必要があります。また、run()メソッドで使用されるブール値がWeakReferenceなどになることはありません。乾杯。 –

+0

正常に動作しているようです。ありがとう! btwに言及したエラーは何ですか? 乾杯。 –

+0

はコピー&ペーストしないでください。アイデアを使用して、あなたのために働いてうれしいです –

1

タイマーイベントが保留中である間、活動が破壊された場合は、[いいえ、それはエラーが発生します。これを回避するには、あるオブジェクトにWeakReferenceを使用し、値を減らします。 しかし、一般的には、テストするのが難しいため、UIといくつかのげっ歯類を混ぜるのは悪い習慣です。あなたのスレッドが強いがありますように、それがメモリリークを起こし破壊され得ることはありません

if (s != null && !s.inUnsubscribed()) { 
s.unsubscribe(); 
s = null; 
} 
関連する問題