본문 바로가기

IT

Parcelable 를 구현할 때 주의점 (ArrayList)

반응형

 상태저장, 복구가 필요한 데이터에 대해서 implements Parcelable 을 구현하게 됩니다. 구현해야 하는 메소드와 CREATOR 에서 사용자 지정 타입의 ArrayList를 저장하는 방법에 대해서 기술합니다.


 ArrayList에 사용할 데이터 클래스는 아래와 같이 기술합니다.


package com.example.testtypedarraylistparcelable;

import android.os.Parcel;
import android.os.Parcelable;

public class InnerData implements Parcelable {
	public int nSeq;
	public String strMessage;
	
	public InnerData(int nSeq, String strMessage) {
		this.nSeq = nSeq;
		this.strMessage = strMessage;
	}
	
	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(nSeq);
		dest.writeString(strMessage);
	}
	private InnerData(Parcel source) {
		nSeq = source.readInt();
		strMessage = source.readString();
	}
	public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
		@Override
		public InnerData createFromParcel(Parcel source) {
			return new InnerData(source);
		}
		@Override
		public InnerData[] newArray(int size) {
			return new InnerData[size];
		}
	};
}

 위의 클래스를 자식클래스로 사용하는 ArrayList를 포함한 클래스는 아래와 같이 작성하였습니다.


package com.example.testtypedarraylistparcelable;

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class TestListData implements Parcelable {
	public ArrayList alData;
	
	public TestListData() {
		alData = new ArrayList();
	}

	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// 요부분 1
		dest.writeTypedList(alData);
	}
	private TestListData(Parcel source) {
		// 요부분 2
		alData = new ArrayList();
		source.readTypedList(alData, InnerData.CREATOR);
	}
	public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
		@Override
		public TestListData createFromParcel(Parcel source) {
			return new TestListData(source);
		}
		@Override
		public TestListData[] newArray(int size) {
			return new TestListData[size];
		}
	};
}

 주의하여 볼 부분은 주석부분 2군데 입니다.


 첫번째로 dest.writeTypedList(alData); 부분으로 데이터를 저장하는 부분입니다. 리스트데이터인데 사용자가 지정한 특별한 데이터타입이므로 TypedList에 해당합니다. 이런 방식으로 저장하면 되고요.


 두번째 source.readTypedList(alData, InnerData.CREATOR); 부분입니다. 주의할 부분은 이 메소드를 실행하기 전에 꼭 ArrayList 데이터를 메모리 할당해야 한다는 겁니다. 안하시면 NullPointerException이 발생합니다. 주의하시고요.

 문장의 의미를 살펴보면 alData 라는 변수에 TypedList를 읽어오라는 것이고, ArrayList에 사용된 데이터타입은 InnerData 클래스 형태라는 것을 알려주고, 해당 클래스의 CREATOR를 이용하여 데이터를 생성하여 전달 받기 위함입니다.


 끝.

반응형