gpt4 book ai didi

java - 返回值的可运行替代方案

转载 作者:行者123 更新时间:2023-12-01 14:08:32 24 4
gpt4 key购买 nike

我需要一些帮助。我必须连续检查通过蓝牙接收的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

最佳答案

您可以使用阻塞队列来解决这个问题,它支持生产者消费者设计模式。 BlockingQueue将是您的“待办事项”列表,生产者将在数据可用时将其放置在其中(字节[]),并且消费者检索当队列准备好处理数据时,将数据(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


}
}

这是检查队列中可用数据并对其进行处理的消费者:

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();
}

}
}

现在启动您的生产者消费者:

BlockingQueue<byte[]> queue = new LinkedBlockingQueue<byte[]>(1);
new Thread(new Producer(queue)).start();
new Thread(new Consumer(queue)).start();

关于java - 返回值的可运行替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18719732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com