Android无法序列化Kotlin Lambda

时间:2019-10-28 23:22:15

标签: android kotlin serialization jvm

我们可以读取lambda函数默认情况下是序列化的(https://discuss.kotlinlang.org/t/are-closures-serializable/1620),
但出现错误:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.dialogfragment.Arguments)

我的班级观点:

class Arguments(val function: ()-> Unit) : Serializable

我的lambda怎么了?
(当Android由于内存不足而需要杀死我的片段时,出现此错误:)

2 个答案:

答案 0 :(得分:0)

如果要序列化或打包,则需要确保每个字段都可序列化或可打包。 在您的情况下,您尝试序列化不可序列化的val function: ()-> Unit。不幸的是,您无法使函数可序列化。您应该重新考虑此参数类并传递一些不同的东西。可能您可以获得一些参数,该参数可以导致决策,然后在片段中调用函数。

答案 1 :(得分:0)

现在使用 Parcelalbe 而不是 Serilizable

1.在 build.gradle 文件(应用)中添加 id 'kotlin-parcelize'

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'kotlin-parcelize'    //here
}

2.打包您的 Lambda 包装类:

@Parcelize
class Listener(val clickAction: () -> Unit) : Parcelable {
    fun onClick() = clickAction()
}