Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每次调用新处理程序(Looper.getMainLooper())是否会创建它的新实例?_Android - Fatal编程技术网

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现在已改为高效。什么是不相关的?我的意思是,在您的实现中,处理程序的一个实例化,即使不需要,也可能与性能没有多大关系。