0

受信したデータを保存し、Bluetooth経由で非同期に送信するarraylistがあります。

arraylist にアクセスするための書き込みスレッドと読み取りスレッドがあります。Bluetoothエコーをシミュレートしようとしています(Bluetoothは、送信したすべてのものをエコーバックすることです)。

private class ReadThread extends Thread {
@Override
public void run() {
    super.run();
        while(!isInterrupted()) {

            try {
                byte[] buffer = new byte[64];
                if (mInputStream == null) return;
                size = mInputStream.read(buffer);
                if (size == 64) {
                    if (bufferList.isEmpty()){
                        Log.i("AOK Fail","Nothing to AOK");
                    }

                    if (compareByte(buffer,bufferList.get(0) == true) // Compare data in this 2 byte array
                          bufferList.remove(0);
                }
            } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }
}
}

private class WriteThread extends Thread {
    @Override
    public void run() {
    super.run();
    while(!isInterrupted()) {

        try {
            count++;
            if (bufferList.isEmpty() == false && count < 3){    
                write(bufferList.get(0));       
                count = 0;
            }else{
                // Drop data after 3 fail attempt
                bufferList.remove(0);
                count=0;
            }               

            Thread.sleep(500);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
    }
}
}

ボタンを押すと、データが送信されます。ゆっくり送信するとうまくいきます。ただし、すばやくクリックし始めると失敗します(送信用のデータをキューに入れます)。AOK Fail メッセージを受け取ったら。新たにデータを追加しても、残りのデータはすべて AOK Fail になります。どうしてこんなことに

それがスレッド化の問題である場合、すべてのデータが送信された後に解決されるべきではありませんか?

4

2 に答える 2

1

この bufferList 変数はスレッドセーフなオブジェクトですか? 配列のブロックリストか何かのような?そうでない場合は、同時に itens を追加/削除しようとすると問題が発生する可能性があります。

これにより、プロデューサースレッドで例外が発生し、他に何も送信されず、「Nothing to AOK」ログが取得されます。

于 2013-07-17T13:11:51.397 に答える
1

一部の詳細が含まれていないため、このコードがどのように機能するかはあまり明確ではありません。

  • あなたはどのように食べbufferListていますか、そしてそのタイプはどれですか?たぶん、あなたの質問で言及したArrayListですか?ArrayList はスレッド セーフではありません。Android の ArrayList ドキュメントを参照してください。
  • どのようなwrite方法がありますか?
  • どのようなcompareByte方法がありますか? 当たり前のように思えますが、念のためにコードを確認することをお勧めします (また、括弧がありません)。
  • countWriteThread クラス内で使用している varはどこで宣言されていますか? countこのコードの外で値をインクリメントしていますか? そうであれば、bufferList変数 when count >= 3(else ブロック) からすべての内容を削除している可能性があります。これを行うと、bufferList.isEmpty() == false && count < 3条件の最初の部分がいつか false になる可能性がbufferListあります。次に、else ブロックを実行して、空の ArrayList から要素を削除しようとすると、コードが IndexOutOfBoudsException をスローし ( ArrayList remove メソッドのドキュメントを参照)、WriteThread が中止されます。
于 2013-07-18T14:04:08.513 に答える