Проблемы многопоточности с atomisboolean

Пытаясь "разработать" код для управления роботом с помощью устройства Android, я застрял в глупой проблеме, и после нескольких недель ее решения я, наконец, обратился к вам за помощью. Я совершенно новичок в Android, а также в Java. Я в основном использую пример bluetoothchat, просто меняя основной макет, рисуя пульт с 4 стрелками. Чтобы использовать эти стрелки, я реализовал функцию, которая должна отправлять байт каждые 300 мсек, пока нажата кнопка imageButton. посмотрите следующий код и не сердитесь, если это беспорядок (я новичок):

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", а затем "набор в ложь", "S отправлено", "t.stop and return", а затем ничего не происходит некоторое время (около 12 секунд), а затем он начинает циклически повторять "сообщение отправлено", "додо", даже если я подниму палец. Если я не позволяю пальцу слишком долго (простым щелчком), я получаю: "stringBuffer=0" "S sent" "a set to false" "t.stop и возвращаю" "actionUp" "a set to true" " сообщение отправлено " "dodo" "StringBuffer=0" "S отправлено "" t.stop and return "

Я действительно потерян и не понимаю, что происходит с этой функцией.

Если это поможет, я отлаживаю на прошивке samsung galaxy tab (GT-P1000) версии 2.2.1

Надеюсь, что кто-то может помочь мне отладить его и объяснить мои проблемы...

1 ответ

Насколько я понимаю, вы спите и зацикливаетесь на потоке пользовательского интерфейса. Вы не должны этого делать - это мешает пользовательскому интерфейсу реагировать на дальнейшие события. Вместо этого вы должны действовать реагирующим образом - если вы хотите, чтобы что-то произошло "через 300 миллисекунд", затем установите для этого таймер и отмените его, если до этого произойдет какое-либо другое соответствующее действие.

Другие вопросы по тегам