Я делаю приложение, которое использует соединение Bluetooth. Я звоню соединение Bluetooth в onCreate()
и закрыть его в onDestroy()
из MainActivity
:Как я могу закрыть BluetoothSocket на экране вращения на Android?
// Bluetooth
private Bluetooth bt;
private boolean registered = false;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = new Bluetooth(this);
bt.enableBluetooth();
bt.setCommunicationCallback(this);
bt.connectToName(bt.getBluetoothDevice(this));
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mReceiver, filter);
registered = true;
}
@Override
public void onDestroy() {
super.onDestroy();
if(registered) {
unregisterReceiver(mReceiver);
registered=false;
}
bt.removeCommunicationCallback();
bt.disconnect();
if (handler != null && runnable != null) {
handler.removeCallbacks(runnable);
}
}
Приложение также поддерживает альбомные и портретные режимы (с использованием двух различных макетов). Когда экран повернут, MainActivity
вызывает функции onCreate()
и onDestroy
, из-за различной компоновки. По этой причине, я получил следующее сообщение об ошибке:
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5a71aa38
A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1051 (le.bluetoothled)
Как я нашел в Invalid heap address and fatal signal 11, он был из close()
метода BluetoothSocket в. Во-первых, я думаю, что мы не нуждаемся в близком bluetooth, когда мы поворачиваем экран, следовательно, я пытался использовать метод для detect rotation event телефона и игнорировать закрытие, когда происходит поворот, однако он не работает. Следовательно, мне кажется, нам нужно закрыть bluetooth при повороте экрана, но я получил вышеуказанную ошибку. Я понятия не имею, как я могу это решить, не могли бы вы помочь мне решить эту проблему? Я использую this Bluetooth LIB с disconnect()
следующим образом:
public void disconnect() {
try {
socket.close();
} catch (IOException e) {
if(communicationCallback!=null)
communicationCallback.onError(e.getMessage());
}
}
В мое текущее решение использует сон. Я добавил Thread.sleep (1000)
перед ближайшей розеткой. Это работает. Но я думаю, что это не очень хорошее решение.
Какой у вас класс 'Bluetooth'? Это «Сервис»? – Bryan
Нет. Это просто нормальный класс, как https://github.com/omaflak/Bluetooth-Library/blob/master/bluetooth/src/main/java/me/aflak/bluetooth/Bluetooth.java – Jame
Что происходит, когда один из потоки, созданные для подключения Bluetooth, все еще работают, и вы поворачиваете устройство? Они ссылаются на старую деятельность. Вы пытаетесь очистить ссылку на обратный вызов активности, но также проверяете другой поток, если он равен нулю. Это небезопасно. – masp