问题描述
我创建了一个方法,在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);
}