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 でデバッグしています。
誰かがデバッグを手伝ってくれて、私の問題を説明してくれることを願っています...