【问题标题】:Implement parcelable with kotlin on an existing java class在现有的 java 类上使用 kotlin 实现 parcelable
【发布时间】:2018-05-13 19:12:41
【问题描述】:

我正在使用UsbSerialForAndroid 库来实现与设备的串行端口连接。

我需要跨活动发送serial port 对象。 UsbSerialPort 的定义是here

目前,我的代码能够在IntentputExtra 方法的帮助下返回一个指定端口地址的字符串。我希望将serial port 发送到其他活动(这是因为我无法从地址重新创建串行端口对象)。

为了将对象与Intent 一起发送,对象应该是可包裹的。但是原来的 library 类文件是在 java 中的。

如何在这样一个预先存在的java类上实现parcelable?我更喜欢使用 kotlin 语言来实现这一点。

编辑

一个看起来合乎逻辑的选择是使用 original SerialUsbPort 类作为基类并将新类扩展为可打包(使用@Parselize 注释),然后转换旧对象进入新的(对吗?)。

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:

    我希望将串口发送到其他活动(这是因为我无法从地址重新创建串口对象)。

    不幸的是,要实现Parcelable,您需要这样做:告诉Android如何将一些数据写入Parcel,以及如何从数据中重新创建这个对象。

    @Parcelize 并没有改变这个要求,它只是告诉编译器以标准的方式生成这些方法。

    要访问无法重新创建的“活动”对象,请改为扩展 Binder(参见 https://developer.android.com/guide/components/bound-services#Binder 以获取 Java 示例)。现在您可以在实现Parcelable 时将Binder 存储在Parcel 中。

    【讨论】:

    • 嗨,感谢您的洞察力。我正在查看您共享的链接,它似乎是在 services 的上下文中谈论活页夹,我在那里没有看到活页夹扩展。
    • class LocalBinder。在您的情况下,您只需要存储 val port: UsbSerialPort 而不是 getService 方法。
    • 或者,创建一个服务,您将通过它访问端口(这是我的偏好)。
    • 关于实现Service 的更多信息。您的意思是我应该从服务中返回UsbSerialPort 吗?或者服务会处理 I/O,所以我只与服务进行文本通信,没有 port 传递业务。
    • 如果需要访问端口的所有活动(或片段、服务等)都在一个进程中,并且可以从多个线程安全地使用端口(可能不是?),我会选择第一个选项,否则使用第二个。
    【解决方案2】:

    所以,总而言之,您的问题是您需要发送一个库对象的实例;但是要发送它,它需要实现一个接口。对吗?

    使用 Java/Kotlin 互操作有几种方法可以做到这一点,但没有一种是特别原创的。实际上,您很幸运,您使用的库也不是用 Kotlin 编写的,因为默认情况下 Kotlin 类是 final。另一方面,Java 类不是;这就是为什么你可以做这样的事情:

    MySerialPort.kt

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

    当然,这是假设一些事情:

    1. 您正在使用库中的 UsbSerialPort 实现。毕竟,您链接的类是一个接口,而不是一个具体的类。您必须从 somewhere 获得一个具体的类才能对其进行初始化,所以我假设它是一个库类。

    2. UsbSerialPortImpl 类不是 final。如上所述,这(对你来说很幸运)不是 Java 中的默认设置,所以你可能很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多