Реализуем parcelable с помощью kotlin в существующем классе Java - PullRequest
0 голосов
/ 13 мая 2018

Я использую библиотеку UsbSerialForAndroid для реализации подключения последовательного порта к устройству.

Мне нужно отправить объект serial port между действиями.Определение для UsbSerialPort: здесь .

На данный момент мой код может вернуть строку, указав адрес порта, с помощью putExtra метода Intent.Я хочу отправить serial port другому действию (это потому, что я не могу воссоздать объект последовательного порта по адресу).

Чтобы отправить объект вместе с Intent, этот объект должен быть пригоден для продажи.Но оригинальный файл library находится в Java.

Как реализовать parcelable на таком уже существующем Java-классе?Я предпочитаю использовать язык kotlin для достижения этой цели.

EDIT

Один вариант, который кажется логичным, - это использование original SerialUsbPort класса в качестве базового класса и расширениеновый класс в parcelable (с аннотацией @Parselize) и затем приведёт старый объект к новому (это даже верно?).

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я хочу отправить последовательный порт другому действию (это потому, что я не могу воссоздать объект последовательного порта по адресу).

К сожалению, для реализации Parcelable вам нужно сделать именно это: сообщить Android, как записать некоторые данные в Parcel и как воссоздать этот объект из данных.

@Parcelize не меняет это требование, он просто указывает компилятору генерировать эти методы стандартным способом.

Чтобы получить доступ к «живому» объекту, который вы не можете воссоздать,вместо этого расширьте Binder (см. пример * Java 1013 *https://developer.android.com/guide/components/bound-services#Binder).Теперь вы можете хранить Binder в Parcel при реализации Parcelable.

0 голосов
/ 13 мая 2018

Итак, ваша проблема в итоге в том, что вам нужно отправить экземпляр библиотечного объекта; но чтобы отправить его, необходимо реализовать интерфейс. Правильно?

Есть несколько способов сделать это с помощью взаимодействия Java / Kotlin, но ни один из них не является особенно оригинальным. На самом деле вам повезло, что используемая вами библиотека также не была написана на Kotlin, потому что классы Kotlin по умолчанию final. Java-классы, с другой стороны, не являются; вот почему вы можете сделать что-то вроде этого:

MySerialPort.kt

class MySerialPort : UsbSerialPortImpl(), Parcelable {
  ...
}

Это, конечно, предполагает несколько вещей:

  1. То, что вы используете UsbSerialPort реализацию из библиотеки. В конце концов, класс, который вы связали, является интерфейсом, а не конкретным классом. Вы должны получить конкретный класс из где-то , чтобы иметь возможность его инициализировать, поэтому я предполагаю, что это библиотечный класс.

  2. Что класс UsbSerialPortImpl не final. Как упоминалось выше, это (к счастью для вас) не по умолчанию в Java, так что вы, вероятно, хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...