当 Activity 进入后台时,Kotlin 多平台 Android 应用程序崩溃

问题描述 投票:0回答:1

我开发了一个 KMP 项目,可以在 iOS 和 Android 中成功构建。我注意到我无法将 Android 应用程序置于后台并恢复活动。它将始终重新创建活动并丢失之前完成的所有用户输入。

看来主要问题是由可序列化对象的写入异常引起的。 我只是不确定从这里到哪里去,以及我应该在这里分享多少代码(或链接到整个存储库),以供遇到类似问题的人重现此问题。 非常感谢您的任何建议。

Android Studio 长颈鹿 | 2022.3.1 补丁2 VM:JetBrains s.r.o. 的 OpenJDK 64 位服务器 VM macOS 13.6.1

Kotlin 多平台版本 1.9.10, Gradle 插件 8.1.0

FATAL EXCEPTION: main
Process: org.haspohr.cmr, PID: 3145
android.os.BadParcelableException: Parcelable encountered IOException writing serializable object (name = org.haspohr.cmr12.screens.StartScreen)
    at android.os.Parcel.writeSerializable(Parcel.java:2797)
    at android.os.Parcel.writeValue(Parcel.java:2563)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeList(Parcel.java:1415)
    at android.os.Parcel.writeValue(Parcel.java:2506)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeList(Parcel.java:1415)
    at android.os.Parcel.writeValue(Parcel.java:2506)
    at android.os.Parcel.writeValue(Parcel.java:2362)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843)
    at android.os.Bundle.writeToParcel(Bundle.java:1389)
    at android.os.Parcel.writeBundle(Parcel.java:1367)
    at android.os.Parcel.writeValue(Parcel.java:2479)
    at android.os.Parcel.writeValue(Parcel.java:2369)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843)
    at android.os.Bundle.writeToParcel(Bundle.java:1389)
    at android.os.Parcel.writeBundle(Parcel.java:1367)
    at android.os.Parcel.writeValue(Parcel.java:2479)
    at android.os.Parcel.writeValue(Parcel.java:2369)
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1917)
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1954)
    at android.app.servertransaction.PendingTransactionActions$StopInfo.collectBundleStates(PendingTransactionActions.java:123)
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:139)
    at android.os.Handler.handleCallback(Handler.java:958)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:205)
    at android.os.Looper.loop(Looper.java:294)
    at android.app.ActivityThread.main(ActivityThread.java:8177)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: java.io.NotSerializableException: org.haspohr.cmr12.GameViewModel
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1620)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1581)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1490)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
    at android.os.Parcel.writeSerializable(Parcel.java:2792)
    at android.os.Parcel.writeValue(Parcel.java:2563) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeList(Parcel.java:1415) 
    at android.os.Parcel.writeValue(Parcel.java:2506) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeList(Parcel.java:1415) 
    at android.os.Parcel.writeValue(Parcel.java:2506) 
    at android.os.Parcel.writeValue(Parcel.java:2362) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843) 
    at android.os.Bundle.writeToParcel(Bundle.java:1389) 
    at android.os.Parcel.writeBundle(Parcel.java:1367) 
    at android.os.Parcel.writeValue(Parcel.java:2479) 
    at android.os.Parcel.writeValue(Parcel.java:2369) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:1298) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1843) 
    at android.os.Bundle.writeToParcel(Bundle.java:1389) 
    at android.os.Parcel.writeBundle(Parcel.java:1367) 
    at android.os.Parcel.writeValue(Parcel.java:2479) 
    at android.os.Parcel.writeValue(Parcel.java:2369) 
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1917) 
    at android.os.BaseBundle.dumpStats(BaseBundle.java:1954) 
    at android.app.servertransaction.PendingTransactionActions$StopInfo.collectBundleStates(PendingTransactionActions.java:123) 
    at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:139) 
    at android.os.Handler.handleCallback(Handler.java:958) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loopOnce(Looper.java:205) 
    at android.os.Looper.loop(Looper.java:294) 
    at android.app.ActivityThread.main(ActivityThread.java:8177) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 

当我通过在模拟器中按 escape 或在真实设备上进入主后台来最小化应用程序时,它应该能够恢复活动。相反,应用程序将始终重新启动,丢失之前的输入。

android kotlin multiplatform
1个回答
0
投票

您面临的问题似乎与未正确实现

(org.haspohr.cmr12.GameViewModel)
接口的对象
Serializable
的序列化有关。当 Android 尝试序列化对象的状态以保存供以后使用时,它会在
StartScreen
类中遇到不可序列化的对象。

您可以采取一些步骤来解决此问题:

  • 检查可序列化实现
  • ViewModel 处理
  • 避免序列化复杂对象
  • 使用 Parcelable 代替
  • 状态恢复
© www.soinside.com 2019 - 2024. All rights reserved.