Android如何防止多次调用handler.postDelayed?

问题描述

我创建了一个方法,在5秒钟后,使用handler.postDelayed将ImageView的alpha设置为0.4。 问题在于该方法被多次调用,因为它位于触摸式监听器的MotionEvent.ACTION_UP内部。因此,我正在寻找一种检测handler.postDelayed是否处于活动状态的方法

private Handler handler;
private Runnable runnable;

private init(){
     runnable = new Runnable(){
         @Override
         public void run(){
             ImageView.setAlpha(0.4f);
         }
     }
 }

 private void setAlpha(){
     handler = new Handler();
     handler.postDelayed(runnable,5000);
 }

 private void cancleHandler(){
     handler.removeCallbacks(runnable);
 }

解决方法

1:保留对处理程序的引用,而不是每次都创建一个全新的引用。

2:Check if the runnable is already posted,并且不要发布新的。

private Handler handler;
private Runnable runnable;

private init(){
     handler = new Handler();
     runnable = new Runnable(){
         @Override
         public void run(){
             ImageView.setAlpha(0.4f);
         }
     }
 }

 private void setAlpha(){
     if (!handler.hasCallbacks(runnable)) {
         handler.postDelayed(runnable,5000);
     }
 }

 private void cancleHandler(){
     handler.removeCallbacks(runnable);
 }
,

尝试在添加另一个回调并使用相同的处理程序实例之前删除该回调:

    private Handler handler;
    private Runnable runnable;
    
    private init(){
         handler = new Handler();
         runnable = new Runnable(){
             @Override
             public void run(){
                 ImageView.setAlpha(0.4f);
             }
         }
     }
    
     private void setAlpha(){
         handler.removeCallbacks(runnable);
         handler.postDelayed(runnable,5000);
     }
    
     private void cancleHandler(){
         handler.removeCallbacks(runnable);
     }