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 부분.
....
}
'IT > Android' 카테고리의 다른 글
Android 미디에이션 적용 시 데이터 보안 섹션 설정 (0) | 2023.02.17 |
---|---|
Android ImageView에서 위아래(height) 공백 제거 (1) | 2023.01.25 |
Android 앱 WebView 로 애드센스 노출 시 주의점. (2) | 2022.11.17 |
Android BottomNavigationView 색상 변경 방법 (icon, text, background) (1) | 2022.10.19 |
Android RecyclerView 검색 기능 적용하기 (0) | 2022.09.29 |
댓글