2017-05-07 3 views
0

次の方法があるとします。メソッドが呼び出されるたびに、の新しいインスタンスがLooperオブジェクトで作成されますか?それとも同じスレッド上で動作しますか?回答に基づいて新しいハンドラ(Looper.getMainLooper())を呼び出すたびに新しいインスタンスを作成しますか?

private void responseListener 
    new Handler(Looper.getMainLooper()).post(new Runnable() { 
     @Override 
     public void run() { 
     //TODO execeute code 
     } 
    }); 
} 

私はこれにコードを変更しました:

private void responseListener() { 
    if (onBitmapSaveListener != null) { 
     if (handler != null && runnable != null) { 
      handler.removeCallbacks(runnable); 
     } 

     runnable = new Runnable() { 
      @Override 
      public void run() { 
       //TODO execeute code 
      } 
     }; 

     handler.post(runnable); 
    } 
} 
+0

メインルーパーに投稿する新しいハンドラインスタンスを作成します – EpicPandaForce

+0

@EpicPandaForceこれは悪いアプローチですか? – Muddz

+0

あなたはおそらく毎回新しいものの代わりに1つを作ることができるかもしれないことを意味します – EpicPandaForce

答えて

2

あなたの最初のコードは、あなたがメソッドを呼び出すたびに新しいHandlerを作成し、新しいRunnable。また、毎回同じスレッドで実行します。 getMainLooper()によって返されたLooperは、すべてのアプリケーション内で同じです。

2番目のアプローチは一歩近づいていますが、それ自体の問題がある可能性があります。

初期設定(おそらくonCreate())内にHandlerを設定して再使用してください。 Runnableにメソッドのスコープの変数が必要ない場合は、同様にします。それ以外の場合は、この部分をそのまま残してください。

private final Handler handler = new Handler(Looper.getMainLooper()); 
private void responseListener() { 
    if (onBitmapSaveListener != null) { 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       //TODO execeute code 
      } 
     }); 
    } 
} 
+1

宣言と初期化をインライン化することができます( 'private final Handler handler = new Handler(Looper.getMainLooper());)。メインルーパーを持つハンドラを使用すると常にメインスレッドにポストされます。どこでも初期化できます。 –

+0

@ tynnありがとう。私はすでに似たようなことをしました。しかし、最終的なキーワードではありません。文脈の中でそれを置くために:私はそれが前にそれがあった方法で悪い業績になるかどうかだけ疑問に思った。あなたが[ここ](https://github.com/Muddz/ViewToBitmap/blob/master/viewtobitmap/src/main/java/com/muddzdev/viewtobitmaplibrary/ViewToBitmap.java#L175)で見ることができるように、それは私の小さなライブラリには、ビューを画像に保存することができます。このコードは、ライブラリを使用しているアプリケーションの保存ボタンをユーザーがクリックするたびに実行されます。 – Muddz

+0

@ tynn効率が悪いということを聞いてうれしいです。関連性のないものは何ですか? – Muddz

関連する問題