CAFE

안드로이드 질문

번들 savedInstanceState에 직렬화 객체 저장 및 복구

작성자옛날꿀호떡|작성시간12.03.22|조회수755 목록 댓글 2

안녕하세요~~

주인장님 강좌 정말 잘 보고 있습니다~

시중에 파는 교재보다 뛰어난 내용이 많아서 정말 좋아요..


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

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


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

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

   }

}

}




감사합니다.


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자슈퍼성근 | 작성시간 12.03.26 안녕하세요. ^^
    컥 저도 해 보니 Serializable 객체내 직렬화 되지 않은 객체가 존재한다고 exception이 발생되네요.
    코드는 이상이 없어 보이는데... 이상한 케이스 이군요.
    디버깅이 되는 환경에서 한번더 확인해 봐야 할 것 같군요. ^^
  • 답댓글 작성자옛날꿀호떡 작성자 본인 여부 작성자 | 작성시간 12.03.27 감사합니다 ^^
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼