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

时间:2014-01-31 12:04:10

标签: java android timer handler

我目前正在开发一款用于调整座位的Android应用。我想要包括的一个特征是当座椅向一个方向移动按钮一段时间后,使座椅移动得更快。

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

您可以在底部看到代码。

我的应用程序到底在做什么?

触摸该按钮的时间超过五秒,该应用程序可以按我的意愿运行。所以它在触摸按钮时发送信号“1”,五秒后发送“0”。尼斯!

当我触摸按钮的时间超过五秒时,它也会在开头发送“1”,并在五秒后发送“0”。 :((

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

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

如果你能帮助我,我将非常感激!谢谢!!!

CODE

   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;

       }} );

1 个答案:

答案 0 :(得分:2)

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

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);
}