Управление Bluetooth-устройствами Tuya из фоновых потоков на Android
Я хочу управлять Bluetooth-устройствами Tuya из фоновых потоков на Android. Но я столкнулся с проблемой: когда я пытался это сделать, я получал IllegalStateException.
Я обнаружил, что библиотеки tuya содержат синглтон
public class OoooO00 {
public BluetoothStateListener OooO0oo = new BluetoothStateListener() {
...
};
В нем реализовано поле BluetoothStateListener, унаследованное от AbsBluetoothListener
public abstract class AbsBluetoothListener implements Callback {
public static final int MSG_INVOKE = 1;
public static final int MSG_SYNC_INVOKE = 2;
public Handler mHandler;
public Handler mSyncHandler;
public AbsBluetoothListener() {
if (Looper.myLooper() != null) {
this.mHandler = new Handler(Looper.myLooper(), this);
this.mSyncHandler = new Handler(Looper.getMainLooper(), this);
} else {
throw new IllegalStateException();
}
}
AbsBluetoothListener контролирует, что он создал в потоке с помощью петлителя. И выбросить IllegalStateException, если он создан из потока без петлителя. Но как вы можете видеть из исходного кода, разработчики tuya предполагают, что этот поток не является MainThred.
Этот синглтон создается при вызове некоторой функции диспетчера Bluetooth. Это означает, что эта функция должна вызываться из основного потока или потока с помощью петлителя.
Но мне нужно вызвать его в фоновых потоках из цепочки RX или сопрограммы.
Как правильно инициализировать библиотеку tuya, чтобы иметь возможность вызывать Bluetooth tuya api из фоновых потоков?
На данный момент я нашел только один обходной путь - вызвать некоторую функцию bluetooth из основного потока после инициализации tuya sdk. Нравится:
val bleMngr = TuyaHomeSdk.getBleManager()
bleMngr.isBleLocalOnline("fakeDeviceId")
После этого синглтон вызывает все остальные функции диспетчера Bluetooth в обработчике из MainThread. Но похоже не действительным способом.