繁体   English   中英

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

[英]Android - Button Timer (Handler - RemoveCallback won't stop PostDelayed)

我目前正在开发用于调整座位的android应用。 我要包括的一个功能是,在一定时间内触摸向一个方向移动座椅的按钮时,可使座椅移动更快。

为此,我想这样开始:当我触摸按钮(在我的代码“ seat_down”中)时,应用程序应发送信号“ 1”。 在一定时间(在我的代码中是五秒钟)触摸按钮之后(仅在这五秒钟之后仍被触摸时),应用程序应发送信号“ 0”。 因此,如果我仅触摸按钮4秒钟然后放开,则该应用程序应该只发送了信号“ 1”,之后没有发送“ 0”。

您可以在底部看到代码。

我的应用程序真正在做什么?

触摸按钮超过五秒钟,该应用程序将按我的要求运行。 因此,它在按下按钮的瞬间发送信号“ 1”,并在五秒钟后发送“ 0”。 太好了!

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

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

我还尝试用Java的标准循环做一个计时器,并在Internet上进行了大量搜索,但是找不到真正能解决我问题的东西。 我知道这里有“ 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时,您都会创建一个处理程序。您将可运行对象发送到的处理程序以及对removeCallbacks进行调用的处理程序是两个不同的处理程序,它们与可运行程序相同。 只需在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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM