按下主页按钮时Android应用程序崩溃,但方向更改工作正常

时间:2016-02-01 11:09:02

标签: java android android-fragments mobile

我正在开发一个Android应用程序,其中片段使用动态创建的视图。我片段中onSaveInstanceState()方法的一部分如下:

outState.putSerializable("intToRow", (HashMap<Integer, View>) intToRow);

当我评论这一行时,一切正常。我现在已经离开了这条线,这就是问题所在: 当我旋转屏幕时,这很好用,我可以使用

onCreate()中访问它
intToRow = (HashMap) savedInstanceState.getSerializable("intToRow");

当按下操作栏上的后退按钮时,片段和活动关闭没有任何问题。那么为什么当我按下主页按钮或多任务按钮时,应用程序会崩溃?堆栈跟踪是:

java.lang.RuntimeException: Parcel: unable to marshal value android.widget.TextView{383ee509 V.ED.... ........ 246,0-492,57 #3}
        at android.os.Parcel.writeValue(Parcel.java:1337)
        at android.os.Parcel.writeMapInternal(Parcel.java:614)
        at android.os.Parcel.writeMap(Parcel.java:598)
        at android.os.Parcel.writeValue(Parcel.java:1255)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
        at android.os.Bundle.writeToParcel(Bundle.java:1096)
        at android.os.Parcel.writeBundle(Parcel.java:663)
        at android.app.FragmentState.writeToParcel(Fragment.java:147)
        at android.os.Parcel.writeTypedArray(Parcel.java:1191)
        at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:380)
        at android.os.Parcel.writeParcelable(Parcel.java:1357)
        at android.os.Parcel.writeValue(Parcel.java:1262)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
        at android.os.Bundle.writeToParcel(Bundle.java:1096)
        at android.os.Parcel.writeBundle(Parcel.java:663)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3116)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3695)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5832)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

我已经看到很多关于整个Parcel: unable to marshal value错误的问题,但我的错误似乎并不匹配。在我的应用程序中,方向更改和销毁片段似乎完美地工作,但按下Home按钮会使其崩溃。我已经度过了Android生命周期,但是当看不到Home时,我看不到任何应该发生的事情。

2 个答案:

答案 0 :(得分:1)

这个答案的确使我朝着正确的方向前进,但是实现过程令人困惑。 该类可能是

public class item { ... }

要解决元帅问题,只需使类可序列化

public class item implements Serializable { .. } 

希望这可以帮助某人...

答案 1 :(得分:0)

我也在努力找到解决这个问题的方法。

我的方形和圆形按钮导致应用程序崩溃,而更改方向并未导致其崩溃。

我认为它一定与RecyclerView或Fragment有关,但我终于意识到这是一个包裹问题。

似乎没有任何明确的解决方案(我搜索和排除故障超过一个小时),所以这是解决方案:

问这个问题的人显示他的logcat说

Parcel: unable to marshal value ______

对他而言,______是android.widget.TextView,但它可能是其他人的其他东西。

无论那个类是什么,问题在于它是Parceled但是没有实现Parcelable。

因此解决方案是为该类实现Parcelable。

我很困惑,因为我已经为我正在Parceling的类实现了Parcelable,但是我不知道我还必须为所有与该主对象类进行Parceled的子类实现Parcelable。

这是为相关类实现Parcelable的方法:

1)检查logcat并找到“无法编组值______”的地方(其中______将是您问题的相关课程。

2)转到相关类的.java文件(如果问题是默认类或不是您的自定义类,则需要创建一个扩展该类的新类,然后转到该类。 java文件)

3)在编辑器中左键单击类名,然后按alt + insert(显示Generate菜单),然后单击Parcelable,然后按OK

4)尝试再次运行您的应用并重现问题。如果它再次发生,请再次检查logcat,因为你可能有多个类需要实现Parcelable(我有2个子类需要实现Parcelables),所以每次检查logcat并为每个类做同样的事情。

5)如果您有多个活动/片段,请尝试在每个页面上重现问题,这样您就不会错过任何其他具有相同问题的课程。

就是这样!

干杯。