[英]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.