繁体   English   中英

可运行的替代方法返回值

[英]Runnable alternative to return a value

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

您可以使用支持生产者使用者设计模式的Blocking queues解决此问题。 BlockingQueue的将是你的“待办事项”列表,其中Producer将放置数据( byte[]因为它变为可用,并且Consumer检索数据( byte[]从队列中),当它准备与数据合作。

创建一个可以连续检查通过蓝牙接收到的byte[]Producer

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

    }
}

现在开始您的ProducerConsumer

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

即使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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM