Java Android按钮计时器(Handler-RemoveCallback赢了&x27;t stop PostDelayed)
我目前正在开发一款用于调整座椅的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”,但激活之前的时间跨度太短。我也读过有关计时器方法和异步任务的内容,但我希望在没有这些的情况下处理它 如果你能帮助我,我将非常感激!谢谢 代码Java Android按钮计时器(Handler-RemoveCallback赢了&x27;t stop PostDelayed),java,android,timer,handler,Java,Android,Timer,Handler,我目前正在开发一款用于调整座椅的android应用程序。我想包括的一个功能是,当按一个方向移动座椅的按钮一段时间后,使座椅移动得更快 为此,我想这样开始:当我触摸一个按钮(在我的代码“seat_down”中)时,应用程序应该发送信号“1”。在触摸按钮一段时间(在我的代码中是五秒钟)后(只有在这五秒钟后仍然触摸按钮时),应用程序才会发送信号“0”。因此,如果我只触摸按钮四秒钟,然后松开,应用程序应该只发送信号“1”,而不是之后的“0” 您可以在底部看到代码 我的应用程序到底在做什么 触摸按钮超过五
每次调用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);
}