【问题标题】:Android: force onKeyListener to waitAndroid:强制 onKeyListener 等待
【发布时间】:2012-04-09 09:48:58
【问题描述】:

我目前有一些与用户在 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 计时器有效。但是,当我尝试重新调用第二个计时器的函数时,我得到一个异常,指出只有初始化视图的主线程才能修改视图。我不确定 Looper 是如何工作的(我只是添加了 Looper,因为它之前抱怨过我需要使用它)。有什么建议吗?

【问题讨论】:

    标签: android multithreading keylistener


    【解决方案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
      }
    });
    

    【讨论】:

    • 我遇到了关于线程的新问题,你知道如何让计划的计时器任务与同时修改视图的函数一起工作吗?
    【解决方案2】:

    您可以实现 TimerTask 以在以后调用 my_function。

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

    【讨论】:

      【解决方案3】:

      一开始我会尝试忽略密钥, 发送包含所有关键数据的延迟消息(handler 和 co), 并在收到消息后传递该关键消息。

      不过,我觉得你还需要setOnKeyListener的其他入口点,可能是onKeyEvent或者dispatchKeyEvent

      只是一个想法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-14
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多