Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android按钮计时器(Handler-RemoveCallback赢了&x27;t stop PostDelayed)_Java_Android_Timer_Handler - Fatal编程技术网

Java Android按钮计时器(Handler-RemoveCallback赢了&x27;t stop PostDelayed)

Java Android按钮计时器(Handler-RemoveCallback赢了&x27;t stop PostDelayed),java,android,timer,handler,Java,Android,Timer,Handler,我目前正在开发一款用于调整座椅的android应用程序。我想包括的一个功能是,当按一个方向移动座椅的按钮一段时间后,使座椅移动得更快 为此,我想这样开始:当我触摸一个按钮(在我的代码“seat_down”中)时,应用程序应该发送信号“1”。在触摸按钮一段时间(在我的代码中是五秒钟)后(只有在这五秒钟后仍然触摸按钮时),应用程序才会发送信号“0”。因此,如果我只触摸按钮四秒钟,然后松开,应用程序应该只发送信号“1”,而不是之后的“0” 您可以在底部看到代码 我的应用程序到底在做什么 触摸按钮超过五

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

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

您可以在底部看到代码

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

触摸按钮超过五秒钟,应用程序就能按我的要求运行。因此,它在触摸按钮的瞬间发送信号“1”,五秒钟后发送信号“0”。很好

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

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

我还试着用java的标准循环做计时器,在互联网上搜索了很多,但我找不到真正解决我问题的方法。我知道有“OnLongClickListener”,但激活之前的时间跨度太短。我也读过有关计时器方法和异步任务的内容,但我希望在没有这些的情况下处理它

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

代码


每次调用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);
}

我将我的Handler und Runnable从onResume复制到onCreate。在那里,它说myHandler和MyRunnable没有被使用。在我的onResume seat_down方法中,它说myHandler不能被解析,MyRunnable不能被解析为变量。你的第二个建议我没有真正理解。我试图将其包含在onCreate中(“死代码”)以及onResume seat_down-method(“myHandler无法解析为变量”)。@user3256557,检查我的更新。您必须创建处理程序并在OnTouchListener外部运行。
@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);
}