Я разрабатываю приложение, которое обнаруживает устройства Bluetooth с помощью функции обнаружения устройств, в частности, эта функция использует широковещательный приемник. Чтобы ускорить работу, я хотел объединить эту функцию в поток, чтобы сделать ее быстрее и не запаздывать пользовательский интерфейс в Kivy, что происходит в MainThread. Я застрял на этом некоторое время, и у меня кончается терпение. Я не новичок в Python, но это мой первый по-настоящему большой проект. Я не понимаю Java, но могу понять.
Код: Выделить всё
def example(self, *args):
# [...] code
from android.broadcast import BroadcastReceiver
self.broadcast_receiver = BroadcastReceiver(self.bluetooth_devices, actions=[self.BluetoothDevice.ACTION_FOUND])
self.broadcast_receiver.start()
# [...] more code
self.broadcast_receiver.stop()
def bluetooth_devices(self, context, intent):
device = cast(self.BluetoothDevice, intent.getParcelableExtra(self.BluetoothDevice.EXTRA_DEVICE))
# [...] code that finds detected devices
Я точно знаю, что обратный вызов в BroadcastReceiver не является проблемой, поскольку он работает нормально, когда пример функции не является многопоточным. Однако как только мы помещаем его в поток, он выдает следующее исключение:
Код: Выделить всё
JVM exception occurred: Didn't find class
"org.kivy.android.GenericBroadcastReceiver" on path: DexPathList[[directory "."],
nativeLibraryDirectories=[/system/lib64,
/system/lib64]]
java.lang.ClassNotFoundException
Насколько я понимаю, это должно означать, что когда функция, состоящая из BroadcastReceiver, является многопоточной, она потенциально теряет доступ к классу, к которому ей необходим доступ для запуска. Если да, то есть ли решение этой проблемы?
Я также знаю, что BroadcastReceiver имеет HandlerThread.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... when-using