Android-点击主页按钮时出现运行时异常

Android-点击主页按钮时出现运行时异常,android,runtime-error,marshalling,parcelable,Android,Runtime Error,Marshalling,Parcelable,在我的活动中,我将链接列表中的JSONObject传递给我的片段,当片段打开并按下设备上的home按钮时,我得到以下错误 FATAL EXCEPTION: main 03-04 17:45:47.698: E/AndroidRuntime(18781): java.lang.RuntimeException: Parcel: unable to marshal value {"ShowRow":true, "isRowSelected":false, "GroupID":1, "Grou

在我的活动中,我将链接列表中的JSONObject传递给我的片段,当片段打开并按下设备上的home按钮时,我得到以下错误

FATAL EXCEPTION: main
03-04 17:45:47.698: E/AndroidRuntime(18781): java.lang.RuntimeException:
Parcel: unable to marshal value
{"ShowRow":true,
 "isRowSelected":false,
 "GroupID":1, 
 "GroupName":"Security",
 "Header":true}
我尝试将LinkedList封装到我自己的parcelable对象中,而不是使用serialize,但这并没有解决问题。我无法在代码中看到错误发生的位置,但在堆栈的其余跟踪状态中:

03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeValue(Parcel.java:1137)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeList(Parcel.java:524)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeValue(Parcel.java:1097)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeMapInternal(Parcel.java:493)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Bundle.writeToParcel(Bundle.java:1612)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeBundle(Parcel.java:507)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:132)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeTypedArray(Parcel.java:1004)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:357)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeParcelable(Parcel.java:1156)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeValue(Parcel.java:1075)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeMapInternal(Parcel.java:493)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Bundle.writeToParcel(Bundle.java:1612)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Parcel.writeBundle(Parcel.java:507)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:1961)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.app.ActivityThread.handleStopActivity(ActivityThread.java:2870)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.app.ActivityThread.access$900(ActivityThread.java:127)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1168)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.os.Looper.loop(Looper.java:137)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at android.app.ActivityThread.main(ActivityThread.java:4476)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at java.lang.reflect.Method.invokeNative(Native Method)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at java.lang.reflect.Method.invoke(Method.java:511)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583)
03-04 17:45:47.698: E/AndroidRuntime(18781):    at dalvik.system.NativeStart.main(Native Method)

因此,我知道这与活动如何试图保存状态有关,但我如何才能捕捉到这一点或防止它发生。

Android报告说,它不知道如何转换(例如mashall)您提供的值以写入包裹。异常堆栈跟踪显示正在调用writeList()。我认为您上面提到的JSONObject没有遵循writeValue()的规则,因此引发了异常

writeValue()的规则解释如下:

确保存储的对象是列出的类型之一或实现可序列化。我怀疑它们没有,如果您无法控制该JSONObject类型的实现,您可能需要自己迭代列表,将其中的任何值转换为字符串或字符串数组,并分别使用writeString()或writeStringArray()将其写出

有关实现parcelable的示例,请参见


如果在可序列化类中存储某些内容,那么存储在其中的任何内容都必须实现可序列化,因此仅将对象放置在可序列化容器中是不起作用的

根据你的描述,以下是对我有效的方法:

public class JSONStore implements Parcelable {
    private LinkedList<JSONObject> list;

public JSONStore(int numobjects)
{
    list = new LinkedList();
    try {
                    //generate some test JSON
        for (int i = 0; i < numobjects; i++) {
            JSONObject j = new JSONObject("{ \"test\":\"" + i + "\" }");
            Log.i("JSON", j.toString());
            list.add(j);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel out, int arg1) {
    // TODO Auto-generated method stub
    ArrayList<String> strings = new ArrayList<String>();


    for(JSONObject j : list)
    {
        strings.add(j.toString());
    }

    out.writeStringArray(strings.toArray(new String[strings.size()]));
}

public static final Parcelable.Creator<JSONStore> CREATOR = new Parcelable.Creator<JSONStore>() {

    public JSONStore createFromParcel(Parcel n)
    {
        return new JSONStore(n);
    }

    public JSONStore[] newArray(int size)
    {
        return new JSONStore[size];
    }
};

private JSONStore(Parcel in) {
    list = new LinkedList();
    final String[] jsonStringValues = in.createStringArray();

    try {

        for (String s : jsonStringValues) {
            list.add(new JSONObject(s));

        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

}

public String toString()
{
    String ret = "";

    for(JSONObject j : list)
    {
        ret += j.toString() + "\n";
    }

    return ret;
}
公共类JSONStore实现了Parcelable{
私有链接列表;
公共JSONStore(int numobjects)
{
列表=新的LinkedList();
试一试{
//生成一些测试JSON
for(int i=0;i
}


我不知道你是否真的关心LinkedList,但不管怎样,这种通用的方法应该能让你达到目的。

是的,我希望避免这样做。如果可能的话,我更愿意找到一种方法将JSONObject封装成可序列化或可打包的对象。如果在可序列化的容器类中存储某个对象,那么存储在其中的任何对象都必须实现可序列化,因此仅将JSONObject对象放在可序列化的容器中是行不通的。这只是Java序列化规则在起作用。Parcelable是一种劳动密集型产品,但请看我上面的例子,也许这会让您找到满意的解决方案。