Android 按住按钮连续循环一个方法
Android button hold to continuously loop a method
我有一个按钮,我设置了一个 ontouchlistener 来连续执行一个方法,但是当我按住按钮时,它会在调用 1 次方法后停止执行。
我的方法基本上是从 2 到 4 连续循环。
下面是我的代码片段。
broadcastButton = (Button) findViewById(R.id.broadcastButton);
broadcastButton.setText("Loop");
broadcastButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
broadcastmode = 1;
schedulePeriodicMethod();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
broadcastmode = 0;
stopPeriodicMethod();
}
return true;
}
});
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
public void stopPeriodicMethod() {
exHandler.removeCallbacks(execution);
}
private Runnable execution = new Runnable() {
@Override
public void run() {
connectDevice(flag);
serialSend("C");
flag++;
if (flag > 4)
flag = 2;
}
};
需要帮助我哪里做错了程序没有循环
我认为 schedulePeriodicMethod();
会调用一次:
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
postDelayed()
会运行一次,需要从方法本身回忆一下
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
schedulePeriodicMethod();
}
这是因为 MotionEvent.ACTION_DOWN
和 MotionEvent.ACTION_MOVE
当你按下按钮时同时触发,使用这种方法
MOVE_THRESHOLD_DP = 20 * getActivity().getResources()
.getDisplayMetrics().density;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "ON Down" + onMoveOccur);
onMoveOccur = false;
mDownPosX = event.getX();
mDownPosY = event.getY();
//your code
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "ON UP==" + onMoveOccur);
if (!onMoveOccur) {
//your code
}
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - mDownPosX) > MOVE_THRESHOLD_DP
|| Math.abs(event.getY() - mDownPosY) > MOVE_THRESHOLD_DP) {
onMoveOccur = true;
}
break;
default:
break;
}
return false;
}
});
移除线程休眠,因为它在这里什么都不做,充其量会让应用程序跳过 6 帧,最坏的情况下甚至可能导致某些设备崩溃,因为它会停止主线程 100 毫秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
并让 shadulePeriodicMethod() 像自己一样调用它
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
if (broadcastmode == 1){
schedulePeriodicMethod();
}
}
从
更改您的起始函数
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
到
public void schedulePeriodicMethod() {
exHandler.post(execution);
}
你的可运行对象:
private Runnable execution = new Runnable() {
@Override
public void run() {
if (broadcastmode ==0) return;
connectDevice(flag);
serialSend("C");
flag++;
if (flag > 4)
flag = 2;
//call the runnable itself again, to keep execution going
exHandler.postDelayed(execution, 100);
}
};
而且,正如 SGal 所说,您的 Thread.sleep 完全没用(顺便说一句,Android 中的 Thread.sleep 不是一个好习惯,尤其是在 UI 线程上)
这是连续循环一个方法的简单方法
//create a handler, override handle message of Handler
private Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// do yo stuffs here like UI update etc.
//create a new message since a message will be consumed once as it //delivered by handler after the delay
Message message = new Message();
message.what = msg.what;
// send the new message with handler
myHandler.sendMessageDelayed(message, 150);
// 150 is time in milliseconds after which handler will give callback
}
};
// 让我们在触摸视图时调用处理程序,将 ontouch 侦听器设置为//你想要的视图
//在触摸视图时,创建一条新消息并将其传递给 // 处理程序
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Message message = new Message();
myHandler.sendMessage(message);
break;
// on action up of on touch of the view, remove the messages and call backs
//case MotionEvent.ACTION_UP:
myHandler.removeCallbacksAndMessages(null);
break;
}
return false;
}
我有一个按钮,我设置了一个 ontouchlistener 来连续执行一个方法,但是当我按住按钮时,它会在调用 1 次方法后停止执行。
我的方法基本上是从 2 到 4 连续循环。
下面是我的代码片段。
broadcastButton = (Button) findViewById(R.id.broadcastButton);
broadcastButton.setText("Loop");
broadcastButton.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
broadcastmode = 1;
schedulePeriodicMethod();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
case MotionEvent.ACTION_UP:
broadcastmode = 0;
stopPeriodicMethod();
}
return true;
}
});
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
public void stopPeriodicMethod() {
exHandler.removeCallbacks(execution);
}
private Runnable execution = new Runnable() {
@Override
public void run() {
connectDevice(flag);
serialSend("C");
flag++;
if (flag > 4)
flag = 2;
}
};
需要帮助我哪里做错了程序没有循环
我认为 schedulePeriodicMethod();
会调用一次:
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
postDelayed()
会运行一次,需要从方法本身回忆一下
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
schedulePeriodicMethod();
}
这是因为 MotionEvent.ACTION_DOWN
和 MotionEvent.ACTION_MOVE
当你按下按钮时同时触发,使用这种方法
MOVE_THRESHOLD_DP = 20 * getActivity().getResources()
.getDisplayMetrics().density;
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d("TAG", "ON Down" + onMoveOccur);
onMoveOccur = false;
mDownPosX = event.getX();
mDownPosY = event.getY();
//your code
break;
case MotionEvent.ACTION_UP:
Log.d("TAG", "ON UP==" + onMoveOccur);
if (!onMoveOccur) {
//your code
}
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(event.getX() - mDownPosX) > MOVE_THRESHOLD_DP
|| Math.abs(event.getY() - mDownPosY) > MOVE_THRESHOLD_DP) {
onMoveOccur = true;
}
break;
default:
break;
}
return false;
}
});
移除线程休眠,因为它在这里什么都不做,充其量会让应用程序跳过 6 帧,最坏的情况下甚至可能导致某些设备崩溃,因为它会停止主线程 100 毫秒
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
并让 shadulePeriodicMethod() 像自己一样调用它
public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
if (broadcastmode == 1){
schedulePeriodicMethod();
}
}
从
更改您的起始函数public void schedulePeriodicMethod() {
exHandler.postDelayed(execution, 100);
}
到
public void schedulePeriodicMethod() {
exHandler.post(execution);
}
你的可运行对象:
private Runnable execution = new Runnable() {
@Override
public void run() {
if (broadcastmode ==0) return;
connectDevice(flag);
serialSend("C");
flag++;
if (flag > 4)
flag = 2;
//call the runnable itself again, to keep execution going
exHandler.postDelayed(execution, 100);
}
};
而且,正如 SGal 所说,您的 Thread.sleep 完全没用(顺便说一句,Android 中的 Thread.sleep 不是一个好习惯,尤其是在 UI 线程上)
这是连续循环一个方法的简单方法
//create a handler, override handle message of Handler
private Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// do yo stuffs here like UI update etc.
//create a new message since a message will be consumed once as it //delivered by handler after the delay
Message message = new Message();
message.what = msg.what;
// send the new message with handler
myHandler.sendMessageDelayed(message, 150);
// 150 is time in milliseconds after which handler will give callback
}
};
// 让我们在触摸视图时调用处理程序,将 ontouch 侦听器设置为//你想要的视图 //在触摸视图时,创建一条新消息并将其传递给 // 处理程序
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Message message = new Message();
myHandler.sendMessage(message);
break;
// on action up of on touch of the view, remove the messages and call backs
//case MotionEvent.ACTION_UP:
myHandler.removeCallbacksAndMessages(null);
break;
}
return false;
}