【问题标题】:Android app crashes when I tap recent apps当我点击最近的应用程序时,Android 应用程序崩溃
【发布时间】:2020-09-21 07:15:54
【问题描述】:

我正在使用HomeActivity,它有一个导航抽屉。此活动有多个选项卡,它们使用片段来显示不同的列表。在每个片段上,我使用FragmentDialog 显示自定义过滤器对话框。

当我单击过滤器菜单项时,会弹出此自定义对话框。如果我在对话框位于顶部时点击最近的项目按钮,则应用程序崩溃并留下此日志。

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.myapplication.fragments.-$$Lambda$EmployeeListFragment$2gfw7BDAN9Jtbj71yfwTPA0wy_4)
    at android.os.Parcel.writeSerializable(Parcel.java:1822)
    at android.os.Parcel.writeValue(Parcel.java:1770)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)
    at android.os.Bundle.writeToParcel(Bundle.java:1232)
    at android.os.Parcel.writeBundle(Parcel.java:878)
    at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167)
    at android.os.Parcel.writeTypedList(Parcel.java:1354)
    at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
    at android.os.Parcel.writeParcelable(Parcel.java:1791)
    at android.os.Parcel.writeValue(Parcel.java:1697)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)
    at android.os.Bundle.writeToParcel(Bundle.java:1232)
    at android.os.Parcel.writeBundle(Parcel.java:878)
    at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:169)
    at android.os.Parcel.writeTypedList(Parcel.java:1354)
    at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
    at android.os.Parcel.writeParcelable(Parcel.java:1791)
    at android.os.Parcel.writeValue(Parcel.java:1697)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542)
    at android.os.Bundle.writeToParcel(Bundle.java:1232)
    at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4604)
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
 Caused by: java.io.NotSerializableException: androidx.appcompat.widget.AppCompatButton
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1233)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1597)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1558)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1481)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1227)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
    at android.os.Parcel.writeSerializable(Parcel.java:1817)
    at android.os.Parcel.writeValue(Parcel.java:1770) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542) 
    at android.os.Bundle.writeToParcel(Bundle.java:1232) 
    at android.os.Parcel.writeBundle(Parcel.java:878) 
    at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167) 
    at android.os.Parcel.writeTypedList(Parcel.java:1354) 
    at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51) 
    at android.os.Parcel.writeParcelable(Parcel.java:1791) 
    at android.os.Parcel.writeValue(Parcel.java:1697) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542) 
    at android.os.Bundle.writeToParcel(Bundle.java:1232) 
    at android.os.Parcel.writeBundle(Parcel.java:878) 
    at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:169) 
    at android.os.Parcel.writeTypedList(Parcel.java:1354) 
    at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51) 
    at android.os.Parcel.writeParcelable(Parcel.java:1791) 
    at android.os.Parcel.writeValue(Parcel.java:1697) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:838) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1542) 
    at android.os.Bundle.writeToParcel(Bundle.java:1232) 
    at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4604) 
    at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

【问题讨论】:

标签: android android-fragments androidx onsaveinstancestate


【解决方案1】:

您正在尝试序列化 EmployeeListFragment,可能是 onPause,但它抱怨:

java.io.NotSerializableException: androidx.appcompat.widget.AppCompatButton

所以你处理实例状态的方式有问题;例如。它还列出:

FragmentState.writeToParcel(FragmentState.java:169)

参见FragmentFragmentDialog 生命周期。


a) 认为您可以使用 transient 关键字将其从序列化中排除:

public transient AppCompatButton mButton = null;

b) 或者将implements Serializable 添加到需要序列化的任何内容中;例如。 public class MyButton implements Serializable(序列化 AppCompatButton 可能没有意义)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多