Android - 按下主页按钮时的RunTimeException

时间:2014-03-05 02:24:17

标签: android runtime-error marshalling parcelable

在我的活动中,我将LinkedList中的JSONObject传递给我的片段,当片段打开并按下设备上的主页按钮时,我收到以下错误。

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对象中,而不是使用序列化,但这并没有解决问题。我无法看到我的代码中出现错误的位置,但是在其余的堆栈跟踪状态中看不到:

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)

所以我知道它与活动如何试图保存状态有关,但我怎样才能发现这一点或阻止它发生。

1 个答案:

答案 0 :(得分:1)

Android报告说它不知道如何转换(例如mashall)您要写入包的值。异常堆栈跟踪显示正在调用writeList()。我希望您在上面提到的JSONObject不遵循writeValue()的规则,因此抛出异常。

这里解释了writeValue()的规则:

http://developer.android.com/reference/android/os/Parcel.html#writeValue(java.lang.Object)

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

另请参阅How can I make my custom objects Parcelable?以获取实现parcelable的一个很好的示例。

如果您在Serializable类中存储了某些内容,那么您在其中存储的内容也必须实现Serializable,因此只将对象放在Serializable容器中是行不通的。

根据您的描述,这些对我有用:

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;
}

}

我不知道你是否真的关心LinkedList,但不管这种一般方法应该让你到那里。