0

在尝试“开发”代码以使用 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 上进行调试

希望有人可以帮助我调试它并解释我的问题......

4

1 回答 1

0

据我了解,您正在 UI 线程中睡觉和循环。您不应该这样做 - 它会阻止 UI 对进一步的事件做出反应。相反,您应该以被动的方式进行操作 - 如果您希望“在 300 毫秒内”发生某些事情,那么设置一个计时器来执行此操作,如果在此之前发生了一些其他适当的操作,则取消它。

于 2012-08-21T12:48:15.037 回答