Android BLE - 自定义线程是否从GattCallback方法启动并完成,最终垃圾回收?
问题描述:
我有一个BLE Android应用程序,我想要接收一个变量已更改的通知,然后更新TextView。 UI组件只能在UI线程上更新,而“OnCharacteristicChanged”方法本质上不是UI线程。所以我做的方式是,如下面我GattCallback(其中BLE_Test是我的主要活动的名称):Android BLE - 自定义线程是否从GattCallback方法启动并完成,最终垃圾回收?
@Override
public void onCharacteristicChanged (BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){
//Get the value as a string from the characteristic, as well as the TextView I want to update
Runnable t = new updateViews(viewToUpdate, updateString);
BLE_Test.this.runOnUiThread(t);
}
在那里我有在主活动这个自定义类:
class updateViews implements Runnable {
TextView viewToChange;
String stringToSet;
public updateViews(TextView viewToChange, String stringToSet) {
this.viewToChange = viewToChange;
this.stringToSet = stringToSet;
}
public void run() {
viewToChange.setText(stringToSet);
}
}
现在,我非常清楚,每次调用“onCharacteristicChanged”时,我都会用新的TextView和String参数创建一个新线程。根据我对Java的了解,一旦“onCharacteristicChanged”线程结束,每个“updateViews”线程都应该被垃圾回收。但是“onCharacteristicChanged”在这方面真的是一个正常的线程吗?我只是想确保这个方法是线程安全的,并且不会导致内存泄漏。另外,如果有更好的方法,让我知道。谢谢。
答
你很好走。
runOnUiThread不会启动一个新线程,但会安排在主线程上执行工作。当任何线程中不再有任何对它们的引用时,您的对象将被正确地垃圾收集。