本帖最后由 gaoyunlong2008 于 2012-12-22 11:30:17 编辑

解决方案 »

  1.   

    btmissile.setVisibility(Button.INVISIBLE);
    这一行有错,这个不能在非UI线程里操作btmissile,界面的更新必须在主线程做,否则会出错。
    至于你上面的代码要怎么改呢,大意如下:
    重新handler的handMessage(Message msg)方法,然后在需要操作btmissile的地方,先不操作,而是直接给handler发一个消息,真正的处理在handler里做。handler的执行时在主线程里做的。如果不太明白就百度一下android handler 的用法。例子很多。
      

  2.   

    子线程中不能操作UI,你把Button的显示和隐藏放在handler中执行,通过handlerMessage执行,它是在主线程中操作UI的,你可以把延时放在子线程中,每隔100ms子线程给handler发个消息就行了。给分啊!
      

  3.   

    我几乎不会java 能帮我简单写下handMessage(Message msg)吗?怎么调用它呢 多谢了
      

  4.   

    handleMessage(Message msg)写法如下 :
     Handler hand = new Handler() {
                public void handleMessage(Message msg) {                 
                    super.handleMessage(msg); 
                 };
             };
      

  5.   

    class Visclass 
    {
    Button btmissile;
    public Visclass(Button btm)
    {
    this.btmissile = btm;
    }
      static int flag;
    public void Vistest()
    {
        final  Handler handler=new Handler()
        {  @Override 
         public void handleMessage(Message msg)
         {   
         int i=0;
         i=msg.arg1;  
                     ViewGroup.LayoutParams mp = 
                    new AbsoluteLayout.LayoutParams(
                    30,
                   60,
                200,
                   340-(i*20)
                    );
          btmissile.setLayoutParams(mp);      
          super.handleMessage(msg);    
          }                    
     };//handler定义
        final Runnable runnable=new Runnable()
        { 
         @Override     
           public void run() 
           {    
         flag=1;
         for(int t=0;t<5;t++)
         {               
              try {
                Message msg=handler.obtainMessage();                    
                   msg.arg1=flag; 
                   handler.sendMessage(msg);
                   Thread.sleep(1000);
                  flag++;
           } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
          }
           }
          }
             }; //runnable定义
                handler.postDelayed(runnable, 0);
    }
    }修改之后 为什么 不是一步一步地显示 只是延时之后显示走到了最后的位置???
      

  6.   

    在handlermessage 里加了btmissile.invalidate();也还是不能一步一步显示
      

  7.   

    你在子线程了每隔一段时间 用handler发一次消息 接受之后再进行处理你要做的动作 就可以实现了
      

  8.   

    修改之后可以延时运行的代码,谢谢各位了
    class Shootclass 
    {
    Button btmissile;
    public Shootclass(Button btm)
    {
    this.btmissile = btm;
    }
      static int flag;
    public void Shoot()
    {
        final  Handler handler=new Handler()
        {  @Override 
         public void handleMessage(Message msg)
         {   
         int i=0;
         i=msg.arg1;  
                     ViewGroup.LayoutParams mp = 
                    new AbsoluteLayout.LayoutParams(
                    30,
                   60,
                200,
                   700-(i*20)
                    );
          btmissile.setLayoutParams(mp);
          btmissile.invalidate();
          super.handleMessage(msg);    
          }                    
     };//handler定义
        final Runnable runnable=new Runnable()
        { 
         @Override     
           public void run() 
           {    
         flag=1;
         for(int t=0;t<40;t++)
         {               
              try {
                Message msg=handler.obtainMessage();                    
                   msg.arg1=flag; 
                   handler.sendMessage(msg);
                   Thread.sleep(200);
                  flag++;
                
           } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
          }
           }
          }
             }; //runnable定义
               new Thread(runnable).start();
    }
    }