【问题标题】:BuffedWriter save of large amounts of BLE data causes GKI errorBuffedWriter 保存大量 BLE 数据导致 GKI 错误
【发布时间】:2015-02-18 03:23:27
【问题描述】:

我有一个 Android 应用程序,我从中接收 BLE 数据(每 62 毫秒通过通知)。该应用程序可以通过 BufferedWriter 将数据保存到文件中。结束大量数据的保存后,我看到如下错误:GKI_exception out of buffers https://code.google.com/p/android/issues/detail?id=65455(除了我的代码没有扫描但接收通知)。对于 100 秒的 kB 保存,我看不到这个错误,但我在 logcat 中看到 1-2MB 的保存,而在 >5-6MB 的保存中,我需要重启 Nexus 7(应用程序和 BLE 完全没有响应)。我在保存结束时在 BufferedWriter 上调用 close()。我该如何解决这个问题?

【问题讨论】:

    标签: android bluetooth-lowenergy bufferedwriter


    【解决方案1】:

    该问题可能与线程有关。您需要确保“保存”操作(将文件数据写入磁盘......一个需要很长时间的操作)不会发生在可能阻止您的 BLE 通知或相关回调的同一线程上下文中。如果您阻止一个线程阻止 BLE 回调方法返回,您将看到蓝牙堆栈被饿死,这就是该回调通常的含义。

    最简单的事情是始终确保将文件数据写入新的后台线程(例如 AsyncTaskThreadIntentService),确保无论您来自哪个线程,长时间写入闪存不会阻塞当前上下文。

    【讨论】:

    • 嗨 Dave,非常感谢您提供的出色的 Android BLE 教程;这是我的代码的基础!是的,这个问题可能与线程有关。我在主线程中打开和关闭 BufferedWriter,但在每个 onCharacteristicRead() 回调中调用它的 write()。我应该在处理程序中移动对 write() 的调用(通过 sendMessage() 调用)。您认为这是问题所在还是一个足够的解决方案,还是仍然需要制作另一个 AsyncTask?
    • 如果你正在接收通知,值不会出现在 onCharacteristicChanged() 中吗?无论哪种方式,我都会建议这样做。如果大量写入堆积,或者写入足够大,则您阻塞回调线程的时间过长。您可以通过处理程序将它们传送回主线程,但是您可能会导致它们阻止 UI 事件。由于写入频繁发生,可能会创建一个新的 HandlerThread 每次都可以使用 AsyncTask 处理文件写入器。
    • 对不起,我的意思是 onCharacteristicChanged() 用于通知。我会试试你的解决方案。
    • 如果我使用 AsyncTask 似乎可以工作,但如果我创建一个线程则不行。我将发布一个关于此的新问题。
    • 嗨,Dave,您能否在stackoverflow.com/questions/28654576/… 解决我的相关问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多