我需要一些帮助。我必须连续检查通过蓝牙接收的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
答案 0 :(得分:1)
您可以使用支持生产者消费者设计模式的Blocking queues
来解决此问题。 BlockingQueue将成为您的“待办事项”列表,其中Producer
将放置数据(byte[]
),而Consumer
将检索数据(byte[]
1}})当它准备好处理数据时从队列中。
创建一个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();
答案 1 :(得分: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
。