我需要制作一个应用程序,按下按钮时,会通过蓝牙将字符发送到Arduino,延迟时间为50毫秒。我是Android新手并在互联网上冲浪我发现了这个解决方案:
base_destra.setOnHoverListener(new View.OnHoverListener() {
@Override
public boolean onHover(View v, MotionEvent event) {
while(event.getAction() == MotionEvent.ACTION_DOWN){
sendData("d");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(event.getAction() == MotionEvent.ACTION_UP){
sendData("10");
}
return false;
}
});
sendData是这样的:
private void sendData(String data){
if(OutStream == null){
return;
}
byte[] comando = data.getBytes();
try {
OutStream.write(comando);
}
catch (IOException e){
Toast.makeText(getBaseContext(),"Errore: comando non mandato",Toast.LENGTH_SHORT).show();
}
}
我在YouTube上看到了一个教程,但是虽然我复制粘贴了显示的代码,但应用程序却没有发送任何内容。
PS:Arduino和手机连接正确。
PPS:抱歉我的英语不好。答案 0 :(得分:0)
您可以使用Timer
。在切换按钮onClick方法中,您可以调用timedDataSender()
,在按钮关闭方法中,您可以将shouldCancel
boolean
变量设置为true
,并且应完成发送任务。以下是示例代码:
/* A sendTimer is used to periodically send data */
private Timer sendTimer;
private Boolean shouldCancel = false;
private void timedDataSender(){
TimerTask task = new TimerTask() {
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
sendData("10");
}
});
if(shouldCancel)
cancel();
}
};
sendTimer = new Timer("Timer");
/* TimerTask, startDelay, period */
sendTimer.scheduleAtFixedRate(task,0,50);
}
答案 1 :(得分:0)
永远不会调用onHover事件,因为当您按住按钮时,不要将鼠标悬停在按钮上,而是触摸它。例如,悬停是一种可用于手写笔的事件。
所以你只需要使用onTouchListener。
但event
和event.getAction()
不是" live"按下按钮的状态。所以你应该检查按钮的当前状态:
best_destra.isPressed()
要实现这一目标,best_destra
需要是最终的。你应该在一个新的线程中执行它,因为它会过度阻塞UI线程。
最终守则:
base_destra.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
new Thread(new Runnable() {
@Override
public void run() {
while(best_destra.isPressed()){
sendData("d");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
return false;
}
});