Android 每次调用新处理程序(Looper.getMainLooper())是否会创建它的新实例?
假设您有以下方法。是否每次调用该方法时,它都会使用Android 每次调用新处理程序(Looper.getMainLooper())是否会创建它的新实例?,android,Android,假设您有以下方法。是否每次调用该方法时,它都会使用循环器对象创建处理程序的新实例?还是在同一个线程上运行 private void responseListener(){ new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { //TODO execeute code } }); } 根据答案,
循环器
对象创建处理程序
的新实例?还是在同一个线程上运行
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);
}
}
每次调用该方法时,您的第一个代码都会创建一个新的
处理程序
和一个新的Runnable
。而且它每次都在同一个线程上运行它。getMainLooper()
返回的Looper
在所有应用程序中都是相同的
您的第二种方法更近了一步,但它本身可能有问题
只需在初始化中设置一个处理程序
(很可能是onCreate()
)并重用它。如果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
}
});
}
}
它创建一个新的处理程序实例,该实例将发布到主looper@EpicPandaForce所以这是一个糟糕的方法?我的意思是你可能只是做一个,而不是一个新的time@EpicPandaForce好的,谢谢!我已经更新了我的问题,您可以内联声明和初始化(
private final Handler=new Handler(Looper.getMainLooper());
)。使用带有主循环器的处理程序将始终发送到主线程,您可以在任何地方初始化它。@tynn谢谢。我已经做了类似的事情。但不能使用final关键字
。把它放在一个环境中:我只是想知道它是否会像我以前那样表现糟糕。正如您所见,它在我的小程序库中使用,用于将视图保存到图像,每当用户在使用我的程序库的任何应用程序中单击“保存”按钮时,代码都会运行。@tynn很高兴听到ineffecient现在已改为高效。什么是不相关的?我的意思是,在您的实现中,处理程序的一个实例化,即使不需要,也可能与性能没有多大关系。