Android:强制onKeyListener等待

时间:2012-03-25 18:35:03

标签: android multithreading keylistener

我目前有一些与用户在AutocompleteTextView中输入内容相关联的操作。但是,我只想在用户停止输入时注册操作。从本质上讲,我不希望在用户进行垃圾邮件打字时发生操作。以下代码可能会更好地解释它。

AutocompleteTextView search = ...;
search.setOnKeyListener(new onKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_UP) {
            if (mTimer != null)
                mTimer.cancel();
            mTimer = new Timer();
            mTimer.schedule(new TimerTask() {
                public void run() {
                    my_func();
                }
            }, 1000);
            return true;
        }
        return false;
    }
}

public void my_func() {
    Looper.prepare();

    // Do some function that changes the View

    Looper.loop();
}

如何强制keyListener等待一定的秒数?

编辑:

我现在使用Timer来安排该功能。请参阅以上编辑的代码。

FIRST计时器有效。但是,当我尝试重新唤起第二个计时器的函数时,我得到一个异常,说明只有初始化View的主线程才能修改View。我不确定Looper是如何工作的(我刚刚添加了Looper因为它之前抱怨我需要使用它)。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

创建一个计时器。当计时器触发时,执行您的操作。如果在定时器到期之前收到另一个按键,请取消定时器并重置。像,

public boolean onKey(View v, int keyCode, KeyEvent event) {
  if (mTimer != null) {
    mTimer.cancel();
  }
  mTimer = new Timer();
  mTimer.schedule(new TimerTask() {
    @Override 
    public void run() {
      // do what you need to do after the one second here
      mTimer = null;
    }
  }, 1000);
}    

如果从计时器任务的run()方法内部修改视图树,则必须强制它在UI线程上发生。你可以这样做,

YouActivity.this.runOnUiThread(new Runnable() {
  @Override
  public void run() {
    // modify your UI components here
  }
});

答案 1 :(得分:1)

您可以实现TimerTask以便稍后调用my_function。

http://developer.android.com/reference/java/util/TimerTask.html

答案 2 :(得分:0)

我会先尝试忽略这个键, 发送包含所有关键数据的延迟消息(处理程序和co), 并在收到邮件后再发送该密钥消息。

但是,我认为你需要setOnKeyListener的其他入口点,可能是onKeyEvent或dispatchKeyEvent

只是一个想法