在尝试“开发”代码以使用 android 设备驱动机器人时,我陷入了一个愚蠢的问题,在寻求解决数周后,我最终会向你寻求帮助。我对android和java都是全新的。我基本上使用的是蓝牙聊天示例,只是更改了主要布局,绘制了一个带有 4 个箭头的遥控器。为了使用这些箭头,我实现了一个函数,只要按下给定的 imageButton,它应该每 300 毫秒发送一个字节。看下面的代码,如果它是一团糟不要太生气(我是初学者):
private void OnTouch(ImageButton IB , final String str){
IB.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, final MotionEvent ev){
Thread t = new Thread() {
public void run() {
try{
if(ev.getAction()== MotionEvent.ACTION_DOWN){
a.set(false);
Log.e(TAG, "a set to false");
}
if(ev.getAction()== MotionEvent.ACTION_MOVE){
a.compareAndSet(true, false);
}
if(ev.getAction() == MotionEvent.ACTION_UP){
Log.e(TAG, "actionUp");
a.set(true);
Log.e(TAG, "a set to true");
}
}
finally{}
}
};
t.start();
while(!a.get()){
sendMessage(str);
Log.e(TAG, "message sent");
try {
Thread.sleep(300);
Log.e(TAG, "dodo");
} catch (InterruptedException e) {
Log.e(TAG, "error thread.sleep");
e.printStackTrace();
}
}
if(a.get())
{
mOutStringBuffer.setLength(0);
Log.e(TAG, "StringBuffer=0");
sendMessage(Stop);
Log.e(TAG, "S sent");
}
t.stop();
Log.e(TAG, "t.stop and return");
return a.get();
}
});
}
atomicBoolean a 在类的开头设置为: private AtomicBoolean a = new AtomicBoolean(true);
我的问题如下:当我按下一个按钮并按住它时,logcat 显示“StringBuffer=0”,然后显示“a set to false”“S sent”“t.stop and return”,然后有一段时间什么都没有(大约 12秒)然后它开始循环“发送的消息”“渡渡鸟”,即使我抬起手指也没有结束。如果我不让手指太长(简单点击),我会得到:“stringBuffer=0”“S sent”“a set to false”“t.stop and return”“actionUp”“a set to true”“已发送消息”“dodo”“StringBuffer=0”“S 已发送”“t.stop 并返回”
我真的很迷茫,不明白这个功能是怎么回事。
如果有帮助,我正在三星 Galaxy Tab (GT-P1000) 固件版本 2.2.1 上进行调试
希望有人可以帮助我调试它并解释我的问题......