我们可以读取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由于内存不足而需要杀死我的片段时,出现此错误:)
答案 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()
}