0

これについて助けが必要です。byte[]Bluetooth経由で受信したものを継続的に確認する必要があります。このために、Runnable を実装していますが、問題は . を返さないことbyte[]です。

このために、Runnable の代わりに Callable を実装しようとしました。これにより、値を返すことができるからです。しかし、 Callable では、変数を 0.5 秒ごとにチェックすることはできません。

では、変数を更新し、必要なときにその値を取得できるようにするための最良の方法は何でしょうか?

これはRunnable私がやったことです:

private final Handler refresh_handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


Runnable refresh_input = new Runnable() {
    @Override
    public void run() {
        bt_read_input = GlobalVar.bt_input;  //Save received value in a local variable
        refresh_handler.postDelayed(refresh_input, 500);
    }
};


refresh_handler.post(refresh_input);  //Call to the function
4

2 に答える 2

1

Blocking queuesこれは、プロデューサー コンシューマー デザイン パターンをサポートするを使用して解決できます。BlockingQueueは「to do」リストになります。 はデータProducer( byte[]) が使用可能になると配置し、はデータを処理する準備が整ったときにキューからConsumerデータ ( ) を取得します。byte[]

Bluetooth 経由で受信しProducerた を継続的にチェックできる を作成します。byte[]

class Producer implements Runnable {
    private final BlockingQueue<byte[]> byteArrayQueue;

    public Producer(BlockingQueue<byte[]> byteArrayQueue) {
        this.byteArrayQueue = byteArrayQueue;
    }

    @Override
    public void run() {
            // Place your data into the queue
        // byteArrayQueue.put(GlobalVar.bt_input);//put received value into the queue


    }
}

そして、これはConsumerで利用可能なデータをチェックし、それでqueue動作します:

class Consumer implements Runnable {
    private final BlockingQueue<byte[]> byteArrayQueue;

    public Consumer(BlockingQueue<byte[]> byteArrayQueue) {
        this.byteArrayQueue = byteArrayQueue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                byte[] take = byteArrayQueue.take();
                            // DO YOUR WORK
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

    }
}

Producerと を開始しますConsumer

BlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(1);
new Thread(new Producer(queue)).start();
new Thread(new Consumer(queue)).start();
于 2013-09-10T14:04:44.293 に答える