2017-05-07 202 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

相关问题