2017-09-10 47 views
1

我有一个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”在这方面真的是一个正常的线程吗?我只是想确保这个方法是线程安全的,并且不会导致内存泄漏。另外,如果有更好的方法,让我知道。谢谢。

回答

1

你很好走。

runOnUiThread不会启动一个新线程,但会安排在主线程上执行工作。当任何线程中不再有任何对它们的引用时,您的对象将被正确地垃圾收集。