【问题标题】:How to handle writing to an OutputStream of BluetoothSocket in Android?如何在Android中处理写入BluetoothSocket的OutputStream?
【发布时间】:2020-01-31 11:40:16
【问题描述】:

Android developer docs 表示read(byte[])write(byte[]) 函数都是阻塞调用,因此不应直接从主线程调用它们。

我知道read() 仅在有要从套接字读取的内容时返回,但是每次我必须使用write() 将一个字节写入套接字的输出流时,我是否必须生成一个新线程作为文档说,如果接收方从套接字读取的速度不够快,这个函数也会阻塞。

此外,在文档的示例中,他们刚刚直接调用了write(),甚至评论说应该直接从活动中调用该函数。

那么处理write() 阻塞时的情况的正确方法是什么,以防止我的应用程序冻结并最终引发 ANR?谢谢!

【问题讨论】:

    标签: android multithreading sockets android-bluetooth


    【解决方案1】:

    在 BLE 中,对 BluetoothGatt 的 readCharacteristic()writeCharacteristic() 的调用不会被阻塞。如果操作成功启动,它们会返回 true

    操作完成后,你会在你的BluetoothGattCallback的onCharacteristicRead()onCharacteristicWrite()的实现中收到结果

    如果您需要在 UI 上显示一些结果,请在 UI 线程中运行这些操作:

    getActivity().runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
                    // UI operations ...
                }
            });
    

    更多信息请关注writeCharacteristic() https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html#writeCharacteristic(android.bluetooth.BluetoothGattCharacteristic)

    【讨论】:

      【解决方案2】:

      您可以在创建套接字时启动“写入线程”。然后使用某种形式的消息传递从您的主线程发送一条消息,其中包含要发送的数据。 “写线程”在等待新消息时阻塞。当它接收到消息时,它将数据写入套接字。只要记住在套接字关闭时退出线程即可。

      在 Android 中,您可以使用 Handler 和 Looper 创建一个可以处理消息的工作线程。参见例如https://blog.mindorks.com/android-core-looper-handler-and-handlerthread-bd54d69fe91a

      但是,如果接收者实际上读取的速度比您发送的慢,请确保您发布的消息不要比处理速度快,否则您最终会耗尽内存。

      【讨论】:

        猜你喜欢
        • 2012-09-03
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 2012-04-30
        • 2011-06-18
        相关资源
        最近更新 更多