0

我需要一些帮助。我必须不断检查byte[]通过蓝牙收到的。为此,我正在实现一个 Runnable,问题是它不返回byte[].

为此,我尝试实现 Callable 而不是 Runnable,因为这让我可以返回一个值。但是使用 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将是您的“待办事项”列表,当数据可用Producer时将在其中放置数据(the byte[]),并在准备好使用数据时从队列中Consumer检索数据(the )。byte[]

创建一个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();
        }

    }
}

现在开始你的Producerand 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 回答
0

尽管 Debojit Saikia 提供了一个非常有用的解决方案,但我面对这个问题的最后方式是这样的:

private final Runnable refresh_input = new Runnable() {

    @Override
    public void run() {
        bt_read_input = GlobalVar.bt_input;
        }
        refresh_handler.postDelayed(refresh_input, 250);
    }
};

而当我想获取变量的值时,我只需要调用全局变量bt_read_input

于 2013-09-12T09:51:00.337 回答