- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Android 应用程序,我从中接收 BLE 数据(通过通知每 62 毫秒)。该应用程序可以通过 BufferedWriter 将数据保存到文件中。在每个 onCharacteristicChanged() 回调中,如果用户启用了文件保存,我会调用 AsyncTask、Thread 或 IntentService 来执行文件写入。
AsyncTask 似乎工作正常。但是文档说 execute 必须在 UI 线程上调用,我是从 BLE 回调中调用它的。那是问题吗?我该如何解决?
使用 Thread 会导致此错误:GKI_exception out of buffers https://code.google.com/p/android/issues/detail?id=65455 (除了我的代码不是扫描而是接收通知)并且如果文件保存时间很长,我需要重新启动 Nexus 7(应用程序和 BLE 变得完全没有响应)。为什么 Thread 不工作,我该如何解决?
IntentService 永远不会转到 onHandleIntent()。这里有什么问题?
这是一些代码:
...
_context = this.getApplicationContext();
...
private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
...
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
...
int mode = 1;
if (mode==0) // Asynctask
new doFileWriteTask().execute(strBuild.toString());
else if (mode==1) // Thread
{
final String str = strBuild.toString();
new Thread(new Runnable() {
public void run() {
try {
_writer.write(str);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
else if (mode==2) // intentService
{
Intent mServiceIntent = new Intent(_context, writeFileService.class);
mServiceIntent.putExtra("foo", strBuild.toString());
startService(mServiceIntent);
}
}
...
};
private class doFileWriteTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
try {
_writer.write(strings[0]);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private class writeFileService extends IntentService {
public writeFileService() {
super("writeFileService");
}
@Override
protected void onHandleIntent(Intent workIntent) {
String dataString = workIntent.getStringExtra("foo");
try {
_writer.write(dataString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
...
最佳答案
But the docs say execute must be invoked on the UI thread, and I'm calling it from the BLE callback. Is that a problem? And how should I fix it?
框架在调用它的同一线程(假设是主线程)上触发 AsyncTask
回调方法。它不会真正影响后台工作,但如果您开始尝试使用 onPostExecute()
等,您可能会看到问题。 AsyncTask
可能不是从您无法控制的线程调用的最佳选择。
Why does the Thread not work and how can I fix it?
我不能确切地说出为什么你仍然看到错误,通过生成一系列私有(private)的非同步线程可能会导致其他令人头疼的问题。如果你想使用单个工作线程,更好的选择是使用单个 HandlerThread
,你可以使用 Handler
从你的事件回调中发布,例如:
…
_workerThread = new HandlerThread("Worker");
_workerThread.start();
_handler = new Handler(_workerThread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
String str = (String) msg.obj;
_writer.write(str);
return true;
}
});
…
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
…
Message msg = Message.obtain(_handler, 0, strBuild.toString());
_handler.sendMessage(msg);
…
}
该解决方案的代码要多一些,但考虑到写入频率,这可能是最有效的选择。
The IntentService never goes to the onHandleIntent(). What are the issues here?
你几乎不应该将顶级 Android 组件( Activity 、服务、内容提供者、接收者)实现为内部类,因为它们也必须在你的 list 中声明(并且内部类的 XML 语法很丑陋).如果您的服务在 list 中没有匹配的条目,那么您永远不会看到它启动。你可能想看看 docs on using services .
至少,作为内部类编写的Service
必须是public static
才能工作。否则框架无法看到它并且无法使用默认构造函数实例化它(非静态内部类与构造函数混淆)。除非您现在正在 try/catch 中调用 startService()
,否则当您尝试此操作时它不会崩溃,我感到很惊讶。
IntentService
可能是您的三个选择中最简单的一个,因为它是最解耦的,并且框架将处理排队工作并在所有传入工作完成后拆除线程。
关于Android Thread vs AsyncTask vs 从 BLE onCharacteristicChanged() 调用的 IntentService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28654576/
我有一个问题,我不知道如何解决。 我可以成功连接到设备,注册以获取有关特性的通知,并且可以在远程设备上的值更改后成功收到通知。 我遇到的问题是,当连续通知到达时,第二个通知并不总是被服务甚至操作系统捕
我正在我的应用程序中使用 BLE 连接。我有一个用于蓝牙功能的类,我正在传递来自不同 fragment 类的命令以写入任何值。 因此根据场景,在 fragment 内,单击按钮将向蓝牙类发送写入命令。
在我的应用程序中,我使用 setCharacteristicNotification 为特征启用通知。在日志猫中,我收到通知 enable true 也在 onDescriptorWrite 回调上获
我正在尝试编写一个 Android 应用程序来模仿我编写的 iOS 应用程序中已经存在的功能。我正在连接 2 个不同的 BLE 设备: 血压袖带 体重秤 在 iOS 上,我的两台设备都运行良好并报告数
我的应用程序执行以下操作: 它使用 onDescriptorWrite 发送命令到 BT 设备。 BT 设备一收到此命令 它开始传输数据到安卓手机。 安卓的onCharacteristicChange
我有一个医疗设备(名为 SnoreCoach),我创建了一个 Android 应用程序并与该设备进行低功耗蓝牙连接。一切(连接到设备、将数据写入特征等)都工作正常,除了 OnCharacteristi
我等待 onCharacteristicChanged() 回调通过 BLE 接收数据。但是,如果 BluetoothDevice 一次发送太多 20 字节的数据包,我最多会收到 10 条通知,而不是
我需要 Ble 的一些响应数据。当我在 ble 上写东西时,我需要从 Ble 读取响应数据。我能够成功启用和禁用我的 ble 设备,但只缺少来自 ble 的响应数据。我还需要将十进制时间转换为整数十六
这是我关于 SO 的第一篇文章。 我在 android 5.0.2 上订阅 GATT 通知时遇到一些问题。 我打算做的是将带有 BLE Shield 的 Arduino 连接到我的 Android 手
我已连接血压设备并在 onServiceDicovered 中设置通知。 我为每个特性设置了通知。但是 onCharacteristicChanged 仍然没有被调用。 public final st
我正在尝试连接蓝牙 LE 温度计。连接到设备工作正常。唯一让我挂断的部分是 gattCallBack 和 onCharacteristicChanged/Read。 'setNotification'
我正试图在退出我的应用程序时断开特征通知。以下是我在 exitCleanup() 函数中的做法: if (btGatt != null && mWriteChar != null) { bool
我有一个 Android 应用程序,我从中接收 BLE 数据(通过通知每 62 毫秒)。该应用程序可以通过 BufferedWriter 将数据保存到文件中。在每个 onCharacteristicC
我是一名优秀的程序员,十分优秀!