以下代码是为了在代码中实现repeat键的(比如按1键,就会不断地打出1直到释放键, 下面的down指得是按下键事件,release 指得是释放键盘)
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        keyevent = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);        if((keycode >= keyevent.KEYCODE_0) && (keycode <= keyevent.KEYCODE_9)){
   new Thread(){   //这个线程就是实现repeat的主要代码,相当于每次按下键都启动一个线程
        public void run() {
            int sleepTime = 800; // repeat的初始时间,就是说按下去800毫秒后才第一次repeat
            while(true){                         
               try {                                        
                    sleep(sleepTime);
                }catch (InterruptedException e) {
                              Log("test InterruptedException ");   // 看看是否被中断
                }
                int action = keyevent.getAction();
                if (action == MotionEvent.ACTION_UP){ //释放键的时候返回
                     return;
                }
                                            
                mHandler.SentMessage(发送一次虚拟down出去);
                sleepTime = 200;  // repeat间隔时间,就是第一次repeat开始后每隔这么久发一次虚拟down
            }
         }
     }.start();
          }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
           keyevent = new KeyEvent(KeyEvent.ACTION_UP, keycode);  //release事件发生
    }    if (keyevent != null && (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP)){
         mHandler.SentMessage(第一次down和最后的release事件都从这里发出);
    }
用以上代码,我输入字符,大部分都是正常,但是有时候输入一个键(比如1)会同时输出2个1出来,通过打日志,发现第一个sleep(sleepTime)好像根本没起作用,据说sleep会被其他线程中断,但是此时Log("test InterruptedException ")   却没有打出来啊,我甚至试着把整个Thread 用synchronized(this){}包起来,还是没用啊

解决方案 »

  1.   

    就是说出现我所说的错误的时候(按下一个键很快会输出1个以上字符), 好像根本没经过第一个sleep(sleepTime)一样,哪怕我把
    int sleepTime = 800改成int sleepTime = 8000都一样
      

  2.   

    我查看Thread.sleep的说明,说这个函数可能会被其他线程中断,我估计出现异常的那一次估计就是sleep被中断了? 但是为啥日志没打出来呢
      

  3.   

    swing中要慎用多线程,AWT Swing的框架机制是单线程模式的,全都工作在EDT线程里。如果是跟界面无关的,都可以用多线程在后台执行,但一旦是和界面显示有关,则必须在EDT线程中执行,否则很容易出错。你在这里实现一个Thread进行模拟,是不安全的。Swing已经给我们提供了一个javax.swing.Timer类,你只要实现一个ActionListener对象的actionPerformed方法,就行了。键盘按下去的时候,定时器启动,每个一个周期执行一次actionPerformed,这里的actionPerformed是在EDT线程中执行的,绝对安全。键抬起的时候,定时器取消。
      

  4.   

    啊,不好意思,我是在J2ME里面做的
      

  5.   

    j2me中也有定时器的,所有的游戏动画之类的都是通过它来实现的,否则展示的将是一团糟!
      

  6.   

    给你个参考文章:http://www.yqdown.com/wangluobiancheng/J2ME/6421.htm
    j2me中,尽量少用多线程,尤其是向你这种用法,线程对处理器的开销很大。