2017-05-07 79 views
0

假設您有以下方法。每次調用方法時,它是否會創建一個帶有Looper對象的Handler的新實例?或者它在同一個線程上運行?是否每次調用新的Handler(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

我的意思是你可以只做一個而不是每次新的一個 – EpicPandaForce

回答

2

你的第一個代碼創建每次調用方法時,一個新的Handler和新Runnable。並且它每次都在同一個線程上運行它。由getMainLooper()返回的Looper在您的所有應用程序中都是相同的。

你的第二種方法是更近一步,但可能有問題本身。

只需在初始化(最可能是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謝謝。我已經做了類似的事情。但不是使用'final關鍵字'。把它放在一個環境中:我只是想知道這是否會像我以前那樣表現糟糕。正如你可以看到[這裏](https://github.com/Muddz/ViewToBitmap/blob/master/viewtobitmap/src/main/java/com/muddzdev/viewtobitmaplibrary/ViewToBitmap.java#L175)它用於我的小處理圖像保存視圖的庫,每當用戶在使用我的庫的任何應用程序中單擊保存按鈕時,代碼就會運行。 – Muddz

+0

@tynn很高興聽到無效現在已被改爲高效。什麼不相關? – Muddz

相關問題