2017-09-10 4 views
1

私は、変数が変更されたという通知を受け取ってから、TextViewを更新するBLE Androidアプリを持っています。 UIコンポーネントはUIスレッドでのみ更新でき、 "OnCharacteristicChanged"メソッドは本質的にUIスレッドではありません。今Android BLE - GattCallbackメソッドからカスタムスレッドが開始され、最終的にガベージコレクトされますか?

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); 
    } 
} 

:私が主な活動で、このカスタムクラスを持っている

@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); 

} 

:だから私はそれを行う方法は、(BLE_Testが私の主な活動の名前です)私のGattCallbackに以下の通りです私は、 "onCharacteristicChanged"を呼び出すたびに、新しいTextViewとStringパラメータで新しいスレッドを作成していることを非常に意識しています。 Javaの知識から、各 "updateViews"スレッドは、 "onCharacteristicChanged"スレッドが終了するとガベージコレクションされるべきです。しかし、 "onCharacteristicChanged"は本当にその点で通常のスレッドですか?私は、このメソッドがスレッドセーフであり、メモリリークを引き起こさないことを確認したいだけです。また、より良い方法があれば教えてください。ありがとう。

答えて

1

あなたはいいですね。

runOnUiThreadは新しいスレッドを開始しませんが、スケジュールはメインスレッドで行います。どのスレッドからもオブジェクトへの参照がなくなると、オブジェクトは適切にガベージコレクションされます。

関連する問題