【问题标题】:Passing a HashMap which contains non Serializable object to another Fragment将包含不可序列化对象的 HashMap 传递给另一个 Fragment
【发布时间】:2021-09-23 22:39:47
【问题描述】:

这是我的非序列化类:

class Foo(val foo: String)

当我尝试将其作为参数时,它不会编译:

MainFragment().apply {
    arguments = Bundle().apply {
        val foo = Foo("foo!")
        putSerializable("key", foo) // compile error
    }
}

但是如果我把它放到一个 HashMap 中,那么我可以把 HashMap 作为一个参数:

MainFragment().apply {
    arguments = Bundle().apply {
        val foo = Foo("foo!")
        val hashMap = hashMapOf("foo" to foo)
        putSerializable("key", hashMap) // compile
    }
}

当我在 Fragment 创建期间尝试从 HashMap 获取 Foo 实例时,我预计会出现类似 NotSerializableException 的错误,因为 Foo 类不可序列化,但它工作正常:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val hashMap = arguments?.getSerializable("key") as HashMap<String, Foo> // unchecked cast warning
    Log.d(TAG, "${hashMap["foo"]?.foo}") // It works fine without an exception
}

并且它在配置更改期间仍然存在。为什么?

【问题讨论】:

    标签: android serialization android-intent android-bundle


    【解决方案1】:

    自我回答

    原来我的应用在进入后台时得到了 RuntimeException。

    java.lang.RuntimeException: Parcel: unable to marshal value com.example.serializationsample.ui.main.Foo@378ca1e
        at android.os.Parcel.writeValue(Parcel.java:1799)
        ...
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:5112)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8154)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
    
    

    我猜实际的序列化是由ActivityManager 当应用程序进入后台而不是片段创建或配置更改时发生的。因为ActivityManager通过IPC技术处理序列化的Bundle来处理进程死亡和应用程序的重新创建。

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多