Android 非ui可运行线程内的postInvalidateDelayed被调用两次
我有一个ImageView的click事件调用openMenu方法。我正在设置自定义视图的动画,因此我在UI线程外部调用postInvalidateDelayed方法,因为在UI线程内部调用时,我的UI的其余部分略微挂起。问题是第一次单击ImageView时,可运行线程实例被调用了两次。在第一次点击后,它只会被调用一次,所以它工作得非常好,就像我想要的那样 如何在第一次单击时停止可运行线程实例运行两次 更新:由于某些奇怪的原因,它只在应用程序第一次安装时发生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
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秒:它将运行几毫秒或更少