0

複数のアクティビティ間で共有される byte[] の 4 つのキューを必要とするアプリに取り組んでいます。ConcurrentLinkedQueue を使用しているのは、IOIO OTG で 2 つの UART と通信するため、ブロックしないようにするためです。初期化された同じメソッドのキューにデータを配置することしかできないようで、制御が別のメソッドに渡されると、サイズは 0 になります。それらを public として宣言し、1 つのアクティビティで初期化すると、他のアクティビティが可能になります。それらを参照してください。ただし、add() の後、サイズはまだ 0 であり、例外はなく、add() は true を返します。それらをシングルトン Application オブジェクトに入れようとしましたが、結果は同じです。

IOIO サービス ルーパーは、出力キューを読み取ってバイトを IOIO に送信し、IOIO からバイトを読み取って入力キューに配置します。他のアクティビティは、データを出力キューに入れ、入力キューからデータを削除します。

ここに私が今持っているもののいくつかの単純化されたコードがあります:

public class MyApp extends Application {
    //for UARTs
    public static Queue<byte[]> inQueue1   = new ConcurrentLinkedQueue<byte[]>();
    public static Queue<byte[]> outQueue1  = new ConcurrentLinkedQueue<byte[]>();
    public static Queue<byte[]> inQueue2   = new ConcurrentLinkedQueue<byte[]>();
    public static Queue<byte[]> outQueue2  = new ConcurrentLinkedQueue<byte[]>();
}

public class MainActivity extends Activity {
    private ToggleButton toggleButton_;
    private Button btnSend_;
    private EditText etTxData;
.
.
.
    public void btnSendOnClick(View v){
        String s = etTxData.getText().toString(); //i.e. s="ABC"
        byte b[] = s.getBytes(); // i.e. b={65, 66, 67}
        MyApp.outQueue1.add(b);  //size is 0 before and after and add() returns true

        etTxData.setText("");
    }

}

いくつかの概念がありませんか?アクティビティ間でノンブロッキング キューを共有する別の方法はありますか?

4

1 に答える 1

0

stefs は正しいです。問題は別の領域にありました。デバッグ方法に問題があり、コードは正しく機能していました。私のエラーは、1 つのスレッドをステップ実行しているときに、もう 1 つのスレッドが全速力で実行されており、調べる前にバイトを消費したことです。

于 2016-11-27T04:57:45.613 に答える