내 앱이 멀리 떨어져 전환되어 일시 중지되면 상태를 유지하는 데 문제가 있습니다. onSaveInstanceState 및 onRestoreInstanceState 메서드를 오버로드하여 내 응용 프로그램 상태 (배열, arraylists, 해시 집합, 열거 형 및 프리미티브로 구성된)에 중요한 변수가 포함 된 유일한 개체를 저장하고 복원합니다. 불행히도, 내 응용 프로그램에서 전환하면 직렬화 오류로 인해 충돌이 발생합니다.객체의 직렬화로 인해 Android에서 RuntimeException이 발생합니다.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Next line causes error when switching apps, but not when rotating screen
savedInstanceState.putSerializable("board", board);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
board = (Board)savedInstanceState.getSerializable("board");
}
지금까지 내가 말할 수있는, 내 유일한 문제는 내가 만든 보드 객체 직렬화되지 않는 것입니다 : 여기에 상태를 저장 및 복원을 위해 내가 가지고있는 코드입니다. 그러나 Serializable을 구현하고 serialVersionUID를 정의하므로 serializable을 만들기 위해 더 많은 작업을 수행해야하는지 알 수 없습니다. 일반적으로 그게 전부입니다.
- 가 getSerializable 방법보다 객체의 인스턴스를 저장하고 검색 할 수있는 더 나은 방법이 있나요 :
나는이 개 질문이? - 런타임 예외를 발생시키지 않고 개체를 serialize하려면 어떻게해야합니까? 내 객체가 화면 회전 문제없이 직렬화 보이지만 앱을 바꿔 치기 할 때 오류가 발생하기 때문에
것은 나는이 예외는 특히 홀수 찾을 수 있습니다. 관련성있는 경우에 대비하여 스택 추적을 아래에 포함했습니다. 내가 요청한 경우 문제의 게시판 (게시판)에서 코드를 게시 할 수도 있습니다. 미리 제안 해 주셔서 감사합니다. drurenia 자신의 의견에서 지적
08-05 18:10:32.322 32059-32059/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.android.Board)
at android.os.Parcel.writeSerializable(Parcel.java:1279)
at android.os.Parcel.writeValue(Parcel.java:1233)
at android.os.Parcel.writeMapInternal(Parcel.java:591)
at android.os.Bundle.writeToParcel(Bundle.java:1627)
at android.os.Parcel.writeBundle(Parcel.java:605)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2252)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3179)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5226)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.io.NotSerializableException: com.example.android.Square
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1205)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1662)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at java.io.ObjectOutputStream.writeNewArray(ObjectOutputStream.java:1205)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1662)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481)
at android.os.Parcel.writeSerializable(Parcel.java:1274)
... 15 more
바보 같은 질문, 당신이 클래스를 직렬화 해주었습니다 *** com.example.android.Square ***? –
좋은 질문입니다. 나는 그것이 필요하다는 것을 깨닫지 못했다. 거대한 스택 추적에서 그 라인을 알아 채지 못했습니다. 그건 내 잘못을 변경; 이제는 HashSet이 StackOverflowError를 일으키는 것처럼 보입니다. 당신의 도움을 주셔서 감사합니다! –