본문 바로가기
IT/Android

Android Intent로 데이터 전달 #Feat. Serializable, Parcelable

by TechTonic 2022. 12. 2.
반응형

Intent 를 통해 데이터를 전달할때 ArrayList<Object> 타입을 전달해야되는데 일반적인 내용으로는 오류가 발생된다.

인터넷 검색 결과 대다수의 블로그에서 'Serializable' 를 사용해서 Object 를 직렬화하라고 되어 있는데

직렬화를 했음에도 데이터 전달이 되지 않는다.

이에 각 데이터 타입에 따른 전달 방법을 공유 합니다.

 

일반 타입 String, int 등..

 

일반 타입은 잘 알고 있는 아래 코드를 사용해서 전달 할 수 있습니다.

아래 예시는 String 타입에 대한 내용이며 다른 타입의 경우 타입에 맞는 getStringExtra 을 변경해주면 된다.

// 데이터 전달
String TmpData = "전달 값";
Intent intent = new Intent(getContext(), TActivity.class);
intent.putExtra("data", TmpData);
startActivity(intent);

// 데이터 받기
Intent intent = getIntent();
String data = intent.getStringExtra("data");

 

 

ArrayList<String> 타입

 

ArrayList<String> 타입도 위 일반 타입과 같이 getStringExtra 의 타입만 변경해주면된다.

아래 예시 참고

// 데이터 전달
ArrayList<String> ArrData = new ArrayList<>();
ArrData.add("aa");
Intent intent = new Intent(getContext(), TActivity.class);
intent.putStringArrayListExtra("data", ArrData);
startActivity(intent);

// 데이터 받기
Intent intent = getIntent();
ArrayList<String> Arr = intent.getStringArrayListExtra("data");

 

ArrayList<Object> 타입

 

해당 타입을 전달하는 과정에서 애를 먹었다.

위에서 설명했듯이 대다수의 블로그에서 Object 타입에 'Serializable' 직렬화를 시켜주면 해결된다라고 되어 있는데

아래와 같은 오류가 발생되었다.

 

  • 처음 발생된 오류 내용

java.lang.RuntimeException: Parcel: unable to marshal value Object
at android.os.Parcel.writeValue(Parcel.java:1897)
at android.os.Parcel.writeList(Parcel.java:1104)
at android.os.Parcel.writeValue(Parcel.java:1844)

 

 

  • Serializable 사용 시 오류 내용

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
at android.os.Parcel.writeSerializable(Parcel.java:2125)
at android.os.Parcel.writeValue(Parcel.java:1895)
at android.os.Parcel.writeList(Parcel.java:1104)
at android.os.Parcel.writeValue(Parcel.java:1844)

 

조사 결과  Android에서는 'Serializable' 로는 ArrayList<Object> 타입을 전달하지 못하는 것으로 파악되고,

'Parcelable' 를 사용해야 하는것으로 확인되었다.

 

아래는 'Parcelable' 를 사용하여 정상적으로 데이터 전송을 한 예시 코드이니 참고하여 사용하길 바랍니다.

 

// 데이터 전송
ArrayList<dataItem> List = new ArrayList<>();
Intent intent = new Intent(getContext(), TActivity.class);
intent.putExtra("data", List);
startActivity(intent);

// 데이터 받기
Intent intent = getIntent();
ArrayList<dataItem> List = intent.getParcelableArrayListExtra("data");

 

여기서 중요!

Object class 에서 Parcelable 를 implements 해줘야 합니다.아래는 예시 코드를 참고해서 Object class를 수정하면 됩니다.

 

public class dataItem implements Parcelable {

    public String Name;
    public String secName;
    public String secPath;
    
    public dataItem(){

    }

    protected dataItem(Parcel in) {
        Name = in.readString();
        secName = in.readString();
        secPath = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(Name);
        dest.writeString(secName);
        dest.writeString(secPath);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<dataItem> CREATOR = new Creator<dataItem>() {
        @Override
        public dataItem createFromParcel(Parcel in) {
            return new dataItem(in);
        }

        @Override
        public dataItem[] newArray(int size) {
            return new dataItem[size];
        }
    };

	....
 	아래 코드는 일반 getter, setter 부분.	
	....


}

 

 

반응형

댓글