atomsbolean的多线程问题



在尝试"开发"一个使用android设备驱动机器人的代码时,我遇到了一个愚蠢的问题,在寻求解决它数周后,我终于会向您寻求帮助。我对android和java都是新手。我基本上使用的是bluetoothchat示例,只是更改了主布局,绘制了一个带有4个箭头的遥控器。为了使用这些箭头,我实现了一个功能,只要按下给定的imageButton,就应该每300ms发送一个Byte。请参阅以下代码,如果它一团糟,不要太生气(我是初学者):

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 Atomic布尔(true);

我的问题如下:当我按下一个按钮并按住它时,logcat显示"StringBuffer=0",然后显示"a set to false"S send"t.stop and return",然后在一段时间内(大约12秒)什么都没有,然后它开始在"message send"中循环"dodo",即使我抬起手指也没有结束。如果我的手指不太长(简单点击),我会获得:"stringBuffer=0"S send"a set to false"t.stop and return"actionUp"a set to true"message send"

我真的很失落,不明白这个功能是怎么回事。

如果它有帮助,我正在调试三星galaxy标签(GT-P1000)固件版本2.2.1

希望有人能帮我调试它,并向我解释我的问题。。。

据我所知,您正在UI线程中休眠和循环。你不应该这么做——它会阻止UI对进一步的事件做出反应。相反,你应该以被动的方式操作——如果你想在"300毫秒"内发生什么事情,那么设置一个计时器,如果在此之前发生了其他适当的动作,就取消它。

相关内容

  • 没有找到相关文章