Android 非ui可运行线程内的postInvalidateDelayed被调用两次

Android 非ui可运行线程内的postInvalidateDelayed被调用两次,android,multithreading,android-asynctask,android-custom-view,runnable,Android,Multithreading,Android Asynctask,Android Custom View,Runnable,我有一个ImageView的click事件调用openMenu方法。我正在设置自定义视图的动画,因此我在UI线程外部调用postInvalidateDelayed方法,因为在UI线程内部调用时,我的UI的其余部分略微挂起。问题是第一次单击ImageView时,可运行线程实例被调用了两次。在第一次点击后,它只会被调用一次,所以它工作得非常好,就像我想要的那样 如何在第一次单击时停止可运行线程实例运行两次 更新:由于某些奇怪的原因,它只在应用程序第一次安装时发生 public class MainM

我有一个ImageView的click事件调用openMenu方法。我正在设置自定义视图的动画,因此我在UI线程外部调用postInvalidateDelayed方法,因为在UI线程内部调用时,我的UI的其余部分略微挂起。问题是第一次单击ImageView时,可运行线程实例被调用了两次。在第一次点击后,它只会被调用一次,所以它工作得非常好,就像我想要的那样

如何在第一次单击时停止可运行线程实例运行两次

更新:由于某些奇怪的原因,它只在应用程序第一次安装时发生

public class MainMenu extends View {
private Bitmap bitmapMenu;
private DisplayMetrics displayMetrics;
int i;
int menuToggle=0,menuFlag=-1; //1 for open - 0 for close
float BitmapMaxTop;
boolean AnimationthreadFlag=true;

public MainMenu(Context context) {
    super(context);

    displayMetrics = new DisplayMetrics();
    ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

    i=displayMetrics.heightPixels;
    bitmapMenu = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.main_menu),displayMetrics.widthPixels,(int) ((0.53f*displayMetrics.heightPixels)-MainActivity.actionbarHeight),false); //works on xperia API level 14
    BitmapMaxTop=((0.53f*displayMetrics.heightPixels)-MainActivity.actionbarHeight);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if(i>=BitmapMaxTop && menuFlag==1){
        canvas.drawBitmap(bitmapMenu,0,i,null);
        i-=10;
    }
    else if(menuFlag==-1){
        canvas.drawBitmap(bitmapMenu,0,displayMetrics.heightPixels,null);
    }
    else{
        canvas.drawBitmap(bitmapMenu,0,BitmapMaxTop,null);
    }

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return super.onTouchEvent(event);

}

void openMenu(){
    menuFlag=1;

    new Thread(new Runnable() {
        int delay=1;

        public void run() {
                if(AnimationthreadFlag){ //true if animation thread is not running
                    AnimationthreadFlag=false;
                    for(int i=1;i<=2000;i++){
                        postInvalidateDelayed(delay);
                        delay+=1;
                        if(i==2000){
                            AnimationthreadFlag=true;
                            MainMenu.this.i=displayMetrics.heightPixels;
                        }
                    }

                }
        }

    }).start();
}
}

为什么你一次发布2000个无效,延迟一毫秒?这是绘图动画的一部分。大约需要2000次失效才能获得视图来绘制动画我希望它…2000次在两秒钟内失效???也就是说,当for循环运行时,2000次失效,并且在每个循环上,一个1ms的延迟被添加到延迟变量,该变量计算postinvalidatedelayed的延迟。该循环几乎立即运行,它不会被任何东西阻止,这并不是说这个循环将运行2秒:它将运行几毫秒或更少