0

Androidデバイスを使用してロボットを駆動するコードを「開発」しようとしているときに、愚かな問題に取り残され、何週間も解決しようとした後、ついにあなたに助けを求めます. 私はAndroidもJavaもまったく初めてです。私は基本的に bluetoothchat の例を使用して、4 つの矢印でリモートを描画するメイン レイアウトを変更するだけです。これらの矢印を使用するために、指定された imageButton が押されている限り、300ms ごとにバイトを送信する関数を実装しました。次のコードを参照してください。混乱していてもあまり怒らないでください (私は初心者です)。

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秒)、その後、指を離しても終了せずに「メッセージが送信されました」「dodo」でループし始めます。指を長く離さないと (単純なクリック)、次のようになります: "stringBuffer=0" "S sent" "a set to false" "t.stop and return" "actionUp" "a set to true" " message sent" "dodo" "StringBuffer=0" "S sent" "t.stop and return"

私は本当に迷っており、この機能で何が起こっているのか理解できません。

それが役立つ場合は、samsung galaxy tab (GT-P1000) ファームウェア バージョン 2.2.1 でデバッグしています。

誰かがデバッグを手伝ってくれて、私の問題を説明してくれることを願っています...

4

1 に答える 1

0

私が理解しているように、UIスレッドでスリープしてループしています。あなたはそれをするつもりはありません-それはUIがそれ以上のイベントに反応するのを止めます. 代わりに、反応的な方法で操作する必要があります。何かを「300 ミリ秒以内」に発生させたい場合は、そのようにタイマーを設定し、それ以前に他の適切なアクションが発生した場合はキャンセルします。

于 2012-08-21T12:48:15.037 に答える