안녕하세요~~
주인장님 강좌 정말 잘 보고 있습니다~
시중에 파는 교재보다 뛰어난 내용이 많아서 정말 좋아요..
저는 요즘 안드로이드프로그래밍정복 이라는 책으로 공부를 하는 중인데요
궁금한 점이 생겨 질문 드립니다. ㅠㅠ
예제 중 아래와 같은 내용이 있습니다..
번들 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;
}
}
}
감사합니다.