请教高手,多线程的难题
以下代码是为了在代码中实现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个以上字符), 好像根本没经过第一个sleep(sleepTime)一样,哪怕我把
int sleepTime = 800改成int sleepTime = 8000都一样