Android-点击主页按钮时出现运行时异常
在我的活动中,我将链接列表中的JSONObject传递给我的片段,当片段打开并按下设备上的home按钮时,我得到以下错误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
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是一种劳动密集型产品,但请看我上面的例子,也许这会让您找到满意的解决方案。