저는 요즘 안드로이드프로그래밍정복 이라는 책으로 공부를 하는 중인데요

궁금한 점이 생겨 질문 드립니다. ㅠㅠ


예제 중 아래와 같은 내용이 있습니다..

번들 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



감사합니다.