출처: http://dante2k.tistory.com/443
상태저장, 복구가 필요한 데이터에 대해서 implements Parcelable 을 구현하게 됩니다.
구현해야 하는 메소드와 CREATOR 에서 사용자 지정 타입의 ArrayList를 저장하는 방법에 대해서
기술합니다.
ArrayList에 사용할 데이터 클래스는 아래와 같이 기술합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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<innerdata> CREATOR = new Parcelable.Creator<innerdata>() { @Override public InnerData createFromParcel(Parcel source) { return new InnerData(source); } @Override public InnerData[] newArray( int size) { return new InnerData[size]; } }; } </innerdata></innerdata> |
위의 클래스를 자식클래스로 사용하는 ArrayList를 포함한 클래스는 아래와 같이 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package com.example.testtypedarraylistparcelable; import java.util.ArrayList; import android.os.Parcel; import android.os.Parcelable; public class TestListData implements Parcelable { public ArrayList<innerdata> alData; public TestListData() { alData = new ArrayList<innerdata>(); } @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<innerdata>(); source.readTypedList(alData, InnerData.CREATOR); } public static final Parcelable.Creator<testlistdata> CREATOR = new Parcelable.Creator<testlistdata>() { @Override public TestListData createFromParcel(Parcel source) { return new TestListData(source); } @Override public TestListData[] newArray( int size) { return new TestListData[size]; } }; } </testlistdata></testlistdata></innerdata></innerdata></innerdata> |
주의하여 볼 부분은 주석부분 2군데 입니다.
첫번째로 dest.writeTypedList(alData); 부분으로 데이터를 저장하는 부분입니다. 리스트데이터인데 사용자가 지정한 특별한 데이터타입이므로 TypedList에 해당합니다. 이런 방식으로 저장하면 되고요.
두번째 source.readTypedList(alData, InnerData.CREATOR); 부분입니다. 주의할 부분은 이 메소드를 실행하기 전에 꼭 ArrayList 데이터를 메모리 할당해야 한다는 겁니다. 안하시면 NullPointerException이 발생합니다. 주의하시고요.
문장의 의미를 살펴보면 alData 라는 변수에 TypedList를 읽어오라는 것이고, ArrayList에 사용된 데이터타입은 InnerData 클래스 형태라는 것을 알려주고, 해당 클래스의 CREATOR를 이용하여 데이터를 생성하여 전달 받기 위함입니다.
끝.
parcelable 에 parcelable 쓰는 방법. ( custom object )
IPC( 프로세스간 통신 ) 을 위한 Parcelable Object 만들기. 어렵지 않아요. 함께 만들어봐요.
안드로이드 개발자 사이트 Parcel
List 류 parcelable 만드는 방법
- Parcelable 을 구현하다 보면, custom class 와 List 류들은 어떻게 parcelable 로 담을 수 있을까 궁금해지게 됩니다. Custom Object 는 참고자료 링크를 확인하면 되겠고.. 문제는 List 류인데.. List 류도 general 한 data type 이기 때문에 어떻게든 parcelable 로 전달하는 방법이 있어야 하고, 안드로이드(자바)에서 이를 고려하지 않았을 리가 없겠죠?
- 만약 다음과 같은 변수들이 있다면..
ArrayList<Integer> integerList;
ArrayList<Book> bookList;
- 다음과 같이 쓸 수 있습니다.
out.writeSerializable( integerList );
out.writeTypedList( bookList );
- 이들을 읽을 때는 다음과 같이..
integerList = (ArrayList<Integer>)in.readSerializable();
in.readTypedList( bookList, Book.CREATOR );
대강 감이 오시죠? Serializable 한 item 들을 가진 List 형태는 serializable 로 쓸 수 있고, custom class item 들을 가진 List 형태는 writeTypedList 와 readTypedList 를 통해서 전달 및 읽습니다.
'IT_Programming > Android_Java' 카테고리의 다른 글
[펌] Android Layout Tricks #1 ( Layout 최적화하기 ) (0) | 2014.06.17 |
---|---|
안드로이드 액티비티와 태스크 (0) | 2014.06.05 |
액티비티의 상태를 저장하고 복원하기 (0) | 2014.06.02 |
[펌] Android MediaCodec과 MediaMuxer! API 살펴보기 (0) | 2014.05.30 |
안드로이드의 RTSP 문제로 인한 HTTP 기반 MP4로의 전환 (0) | 2014.05.30 |