java - Android - 按钮计时器(处理程序 - RemoveCallback 不会停止 PostDelayed)

标签 java android timer handler

我目前正在开发一款用于调整座椅的 Android 应用程序。我想包括的一个功能是让座椅移动得更快,当触摸按钮向一个方向移动座椅一定时间时。

为此,我想这样开始:当我触摸一个按钮(在我的代码“seat_down”中)时,应用程序应该发送信号“1”。在一定时间后(在我的代码中是五秒)触摸按钮(并且只有在这五秒后它仍然被触摸时)应用程序应该发送信号“0”。因此,如果我只触摸按钮四秒钟然后松手,应用程序应该只发送信号“1”,而不是之后发送“0”。

您可以在底部看到代码。

我的应用真正在做什么?

触摸按钮超过 5 秒,应用程序将按我希望的方式运行。所以它在触摸按钮的那一刻发送信号“1”,五秒后发送“0”。不错!

当我触摸按钮的时间短于五秒时,它还会在开始时发送“1”,在五秒后发送“0”。 :((

不知何故,当我不再触摸按钮时,“myHandler.removeCallbacks(MyRunnable)”无法正常工作。但是当我松开按钮时应用程序发送消息“2”,因此它正在识别“MotionEvent.ACTION_UP”。 当我在代码的另一个位置编写“myHandler.removeCallbacks(MyRunnable)”时,例如“return true”之前的一行,它会完美地停止 postDelayed。不幸的是,即使我仍在触摸按钮,它也会一直停止 postDelayed。

我也尝试用 java 的标准循环做一个计时器并在互联网上搜索了很多,但我找不到真正解决我问题的东西。我知道有“OnLongClickListener”,但它被激活的时间跨度太短了。我还阅读了有关 Timer 方法和 AsyncTask 的内容,但我希望没有这些方法也能处理它。

如果你能帮我解决这个问题,我将不胜感激!谢谢!!!

代码

   seat_down = (ImageButton) findViewById(R.id.arrow_down);
   seat_down.setOnTouchListener(new OnTouchListener() {

       @Override
       public boolean onTouch(View v, MotionEvent event) {

           Handler myHandler = new Handler();

           final Runnable MyRunnable = new Runnable() {

               @Override
               public void run() {


                   String message2 = "0";
                   sendMessage(message2); 


               }
           };



           switch(event.getAction()) {
           case MotionEvent.ACTION_DOWN:


           String message1 = "1";
           sendMessage(message1);


           myHandler.postDelayed(MyRunnable, 5000);


       break;

       case MotionEvent.ACTION_UP:

           myHandler.removeCallbacks(MyRunnable);
           break;

       }
return true;

       }} );

最佳答案

您每次调用 onTouch 时都会创建一个处理程序...您将 runnable 发送到的处理程序和您调用 removeCallbacks 的处理程序是两个不同的处理程序,与您的 runnable 相同。 只需在您的 onCreate... 或使用

创建处理程序和可运行对象
if(handler==null) handler = new Handler() ... 

更新:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    final Handler handler = new Handler();

    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            sendMessage("0");
        }
    };


    Button btn = (Button) findViewById(R.id.btn);

    btn.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                sendMessage("1");
                handler.postDelayed(runnable, 5000);
                break;
            case MotionEvent.ACTION_UP:
                handler.removeCallbacks(runnable);
                break;
            }
            return true;
        }
    });

}

private void sendMessage(String message) {
    Log.i("Message", message);
}

关于java - Android - 按钮计时器(处理程序 - RemoveCallback 不会停止 PostDelayed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479670/

相关文章:

android - 在运行时在 FloatingActionButton 上设置 layout_anchor

javascript - jQuery 显示 setTimeout 定时器

javascript - 当计时器为零时如何显示 div?

c - 主从配置中的 STM32 奇数定时器 1 行为 - mb 代码问题

java - Netbeans 不会在调试器中拾取 Java 类

Java Swing 按钮组单击时清除

java - 如何改变按键音量?

android - flutter 错误 "Android dependency ' androidx.core :core' has different version"using flutter_local_notifications and location packages

java - IntelliJ 不创建未知用法的方法

java - 缺少内存 : size of young generation includes only one survivor space