Как запустить поток, определенный в закрытом внутреннем классе? - PullRequest
0 голосов
/ 03 июля 2019

Я нашел этот пример того, как читать с сокета Bluetooth, используя отдельную ветку чтения на сайте разработчика Android . Поток чтения определен в закрытом внутреннем классе "ConnectedThread".

class MyBluetoothService(
        // handler that gets info from Bluetooth service
        private val handler: Handler) {

    private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

        private val mmInStream: InputStream = mmSocket.inputStream
        private val mmOutStream: OutputStream = mmSocket.outputStream
        private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream

        override fun run() {
            var numBytes: Int // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs.
            while (true) {
                // Read from the InputStream.
                numBytes = try {
                    mmInStream.read(mmBuffer)
                } catch (e: IOException) {
                    Log.d(TAG, "Input stream was disconnected", e)
                    break
                }

                // Send the obtained bytes to the UI activity.
                val readMsg = handler.obtainMessage(
                        MESSAGE_READ, numBytes, -1,
                        mmBuffer)
                readMsg.sendToTarget()
            }
        }
 //Other functions like write, cancel that I omitted from this example

}

Итак, я добавил функцию в MyBluetoothService, чтобы запустить поток чтения:

 @JvmStatic
fun read(){
val reader = ConnectedThread(myBluetoothSocket)
Reader.start()
}

Но это дает немедленную ошибку:

Конструктор внутреннего класса ConnectedThread может быть вызван только с приемник содержащего класса

Как мне начать поток с примера кода?

1 Ответ

1 голос
/ 03 июля 2019

Ваш ConnectedThread является внутренним классом MyBluetoothService, поэтому его нельзя создать вне экземпляра MyBluetoothService.

Измените это следующим образом (удалить private inner):

class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

Вам нужно будет получить доступ к сервису другим способом или альтернативно создать метод фабрики в вашем сервисе, который создает экземпляр потока и возвращает его.

...