@@ -155,8 +155,26 @@ public void startAdvertising() {
155
155
156
156
// these service will be listened.
157
157
// FIXME these didn't used for service discovery
158
- gattServer .addService (informationGattService );
159
- gattServer .addService (midiGattService );
158
+ boolean serviceInitialized = false ;
159
+ while (!serviceInitialized ) {
160
+ try {
161
+ gattServer .addService (informationGattService );
162
+ gattServer .addService (midiGattService );// NullPointerException, DeadObjectException thrown here
163
+ serviceInitialized = true ;
164
+ } catch (Exception e ) {
165
+ Log .d (Constants .TAG , "Adding Service failed, retrying.." );
166
+
167
+ try {
168
+ gattServer .clearServices ();
169
+ } catch (Throwable ignored ) {
170
+ }
171
+
172
+ try {
173
+ Thread .sleep (100 );
174
+ } catch (InterruptedException ignored ) {
175
+ }
176
+ }
177
+ }
160
178
161
179
// set up advertising setting
162
180
AdvertiseSettings advertiseSettings = new AdvertiseSettings .Builder ()
@@ -264,6 +282,7 @@ private void disconnectByDeviceAddress(@NonNull String deviceAddress) {
264
282
if (midiInputDevice != null ) {
265
283
midiInputDevicesMap .remove (deviceAddress );
266
284
285
+ ((InternalMidiInputDevice ) midiInputDevice ).stop ();
267
286
midiInputDevice .setOnMidiInputEventListener (null );
268
287
269
288
if (midiDeviceDetachedListener != null ) {
@@ -306,6 +325,7 @@ public void terminate() {
306
325
307
326
synchronized (midiInputDevicesMap ) {
308
327
for (MidiInputDevice midiInputDevice : midiInputDevicesMap .values ()) {
328
+ ((InternalMidiInputDevice ) midiInputDevice ).stop ();
309
329
midiInputDevice .setOnMidiInputEventListener (null );
310
330
}
311
331
midiInputDevicesMap .clear ();
@@ -368,6 +388,7 @@ public void onReceive(Context context, Intent intent) {
368
388
if (midiInputDevice != null ) {
369
389
midiInputDevicesMap .remove (deviceAddress );
370
390
391
+ ((InternalMidiInputDevice ) midiInputDevice ).stop ();
371
392
midiInputDevice .setOnMidiInputEventListener (null );
372
393
if (midiDeviceDetachedListener != null ) {
373
394
midiDeviceDetachedListener .onMidiInputDeviceDetached (midiInputDevice );
@@ -572,6 +593,13 @@ public InternalMidiInputDevice(@NonNull BluetoothDevice bluetoothDevice) {
572
593
this .bluetoothDevice = bluetoothDevice ;
573
594
}
574
595
596
+ /**
597
+ * Stops parser's thread
598
+ */
599
+ void stop () {
600
+ midiParser .stop ();
601
+ }
602
+
575
603
@ Override
576
604
public void setOnMidiInputEventListener (OnMidiInputEventListener midiInputEventListener ) {
577
605
midiParser .setMidiInputEventListener (midiInputEventListener );
0 commit comments