BuffedWriter保存大量BLE数据导致GKI错误
BuffedWriter save of large amounts of BLE data causes GKI error
我有一个 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()。我该如何解决这个问题?
问题可能与线程相关。您需要确保 "save" 操作(将文件数据写入磁盘......需要很长时间的操作)不会在可能阻止您的 BLE 通知或相关回调的同一线程上下文中发生.如果您阻止阻止 BLE 回调方法返回的线程,您将看到蓝牙堆栈被饿死,这就是该回调通常意味着的。
最简单的事情是始终确保在新的后台线程中写入文件数据(例如 AsyncTask
、Thread
或 IntentService
),确保无论您来自哪个线程,对闪存的长时间写入不会阻塞当前上下文。
我有一个 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()。我该如何解决这个问题?
问题可能与线程相关。您需要确保 "save" 操作(将文件数据写入磁盘......需要很长时间的操作)不会在可能阻止您的 BLE 通知或相关回调的同一线程上下文中发生.如果您阻止阻止 BLE 回调方法返回的线程,您将看到蓝牙堆栈被饿死,这就是该回调通常意味着的。
最简单的事情是始终确保在新的后台线程中写入文件数据(例如 AsyncTask
、Thread
或 IntentService
),确保无论您来自哪个线程,对闪存的长时间写入不会阻塞当前上下文。