저는 요즘 안드로이드프로그래밍정복 이라는 책으로 공부를 하는 중인데요
궁금한 점이 생겨 질문 드립니다. ㅠㅠ
예제 중 아래와 같은 내용이 있습니다..
번들 savedInstanceState 저장, 복구하는 내용인데요...
직렬화 객체.
ArrayList<Vertex> arVertex;
public class Vertex implements Serializable { .... }
프로그램 상태를 저장하기 위해
onSaveInstanceState 에서
outState.putSerializable("Curve", arVertex); 함수를 사용하여
객체를 저장하고
onCreate 에서
arVertex = (ArrayList<Vertex>)savedInstanceState.getSerializable("Curve");
저장한 객체를 복원 시키는 예제 소스 입니다.
이 예제 소스가 화면을 가로, 세로 전환 할때 정상적으로 작동을 합니다.
그런데 홈버튼을 누르면 익셉션이 뜨면서 프로그램이 강제 종료 되는데 이유를 모르겠습니다.ㅠㅠ
조언 부탁 드리겠습니다~~
Vertex 객체를
public class Vertex implements Serializable { .... } 에서
class Vertex implements Parcelable { .... } 로
변경하여 onSaveInstanceState 에서
outState.putParcelableArrayList("Curve", arVertex); 하는걸로 수정하면 익셉션이 안뜹니다..
## 아래는 전체 소스 입니다.
package exam.andexam;
import! java.io.*;
import! java.util.*;
import! android.app.*;
import! android.content.*;
import! android.graphics.*;
import! android.os.*;
import! android.view.*;
public class C14_SaveCurve extends Activity {
private MyView vw;
ArrayList<Vertex> arVertex;
@SuppressWarnings("unchecked")
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vw = new MyView(this);
setContentView(vw);
if (savedInstanceState == null) {
arVertex = new ArrayList<Vertex>();
} else {
arVertex = (ArrayList<Vertex>)savedInstanceState.getSerializable("Curve");
}
}
public void onSaveInstanceState(Bundle outState) {
outState.putSerializable("Curve", arVertex);
}
public class Vertex implements Serializable {
private static final long serialVersionUID = 100L;
Vertex(float ax, float ay, boolean ad) {
x = ax;
y = ay;
Draw = ad;
}
float x;
float y;
boolean Draw;
}
protected class MyView extends View {
Paint mPaint;
public MyView(Context context) {
super(context);
// Paint 객체 미리 초기화
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(3);
mPaint.setAntiAlias(true);
}
public void onDraw(Canvas canvas) {
canvas.drawColor(0xffe0e0e0);
// 정점을 순회하면서 선분으로 잇는다.
for (int i=0;i<arVertex.size();i++) {
if (arVertex.get(i).Draw) {
canvas.drawLine(arVertex.get(i-1).x, arVertex.get(i-1).y,
arVertex.get(i).x, arVertex.get(i).y, mPaint);
}
}
}
// 터치 이동시마다 정점들을 추가한다.
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
arVertex.add(new Vertex(event.getX(), event.getY(), false));
return true;
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
arVertex.add(new Vertex(event.getX(), event.getY(), true));
invalidate();
return true;
}
return false;
}
}
}
### 아래는 Parcelable 로 변경한 소스 입니다.
package exam.andexam;
import! java.util.*;
import! android.app.*;
import! android.content.*;
import! android.graphics.*;
import! android.os.*;
import! android.view.*;
class Vertex implements Parcelable {
Vertex(float ax, float ay, boolean ad) {
x = ax;
y = ay;
Draw = ad;
}
float x;
float y;
boolean Draw;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloat(x);
dest.writeFloat(y);
dest.writeBooleanArray( new boolean[] { Draw } );
}
public static final Parcelable.Creator<Vertex> CREATOR = new Creator<Vertex>() {
public Vertex createFromParcel(Parcel source) {
int x = source.readInt();
int y = source.readInt();
boolean[] td = new boolean[1];
source.readBooleanArray(td);
return new Vertex(x, y, td[0]);
}
public Vertex[] newArray(int size) {
return new Vertex[size];
}
};
}
public class C14_SaveCurve2 extends Activity {
private MyView vw;
ArrayList<Vertex> arVertex;
int Count;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
vw = new MyView(this);
setContentView(vw);
if (savedInstanceState == null) {
arVertex = new ArrayList<Vertex>();
} else {
arVertex = savedInstanceState.getParcelableArrayList("Curve");
}
}
public void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList("Curve", arVertex);
}
protected class MyView extends View {
Paint mPaint;
public MyView(Context context) {
super(context);
// Paint 객체 미리 초기화
mPaint = new Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(3);
mPaint.setAntiAlias(true);
}
public void onDraw(Canvas canvas) {
canvas.drawColor(0xffe0e0e0);
// 정점을 순회하면서 선분으로 잇는다.
for (int i=0;i<arVertex.size();i++) {
if (arVertex.get(i).Draw) {
canvas.drawLine(arVertex.get(i-1).x, arVertex.get(i-1).y,
arVertex.get(i).x, arVertex.get(i).y, mPaint);
}
}
}
// 터치 이동시마다 정점들을 추가한다.
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
arVertex.add(new Vertex(event.getX(), event.getY(), false));
return true;
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
arVertex.add(new Vertex(event.getX(), event.getY(), true));
invalidate();
return true;
}
return false;
}
}
}
## LogCat 내용 입니다.
03-26 18:43:50.271: E/AndroidRuntime(367): FATAL EXCEPTION: main
03-26 18:43:50.271: E/AndroidRuntime(367): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = exam.andexam.C14_SaveCurve$Vertex)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeSerializable(Parcel.java:1176)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeValue(Parcel.java:1130)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeList(Parcel.java:519)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeValue(Parcel.java:1092)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeMapInternal(Parcel.java:488)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Bundle.writeToParcel(Bundle.java:1552)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeBundle(Parcel.java:502)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.app.ActivityManagerProxy.activityPaused(ActivityManagerNative.java:1615)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:2298)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.app.ActivityThread.access$1700(ActivityThread.java:117)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:938)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Handler.dispatchMessage(Handler.java:99)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Looper.loop(Looper.java:130)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.lang.reflect.Method.invokeNative(Native Method)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.lang.reflect.Method.invoke(Method.java:507)
03-26 18:43:50.271: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-26 18:43:50.271: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-26 18:43:50.271: E/AndroidRuntime(367): at dalvik.system.NativeStart.main(Native Method)
03-26 18:43:50.271: E/AndroidRuntime(367): Caused by: java.io.NotSerializableException: exam.andexam.C14_SaveCurve
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:1143)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:413)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1241)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
03-26 18:43:50.271: E/AndroidRuntime(367): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
03-26 18:43:50.271: E/AndroidRuntime(367): at android.os.Parcel.writeSerializable(Parcel.java:1171)
03-26 18:43:50.271: E/AndroidRuntime(367): ... 18 more
감사합니다.




오류코드를 주세용
LOGLOGLOG CATACATCAT