Parcel에서 Null 값을 올바르게 읽는 방법을 이해하려고합니다. 의 내 사용 사례를 살펴 보자 :이 질문을 위해서Parcel, ClassLoader 및 Null 값 읽기
public class MyModel implements Parcelable {
private Long id;
private String name;
public MyModel() {}
public MyModel(Parcel in) {
readFromParcel(in);
}
@Override public int describeContents() {
return 0;
}
@Override public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(id);
dest.writeValue(name);
}
public void readFromParcel(Parcel in) {
id = (Long) in.readValue(Long.class.getClassLoader());
name = (String) in.readValue(String.class.getClassLoader());
}
}
,의는 String
유형 인 필드 name
의 예를 보자.
은 내가 대신 writeValue
의 writeString
사용할 수 있지만 writeString
가 null이었다 NullPointerException
name
경우가 발생합니다 이해합니다.
name
이 null 인 경우 readValue
을 시도한 다음 String
으로 캐스팅하면 예외가 발생합니다.
그런 경우 Parcel에서 Null 값을 읽는 가장 좋은 방법은 무엇입니까? 소포에서 읽을 때마다 null을 확인해야합니까? 그러나 모델에 많은 필드가있는 경우에는 너무 많이됩니다. 읽을 때 null
또는 ClassLoader
을 전달하는 것과 다른 점은 무엇입니까? Parcel을 읽을 때 값이 null이면 클래스 로더가 빈/기본 객체를 반환합니까? java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.MyActivity}: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7209045 at offset 1368
writeString (null)이 작동합니다. writeValue가 어떻게 구현되는지보십시오. http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/os/Parcel.java#1182 그냥 writeString을 사용합니다. 전달 된 인수가 – pskink
@pskink입니다. writeString이 nativeWriteString을 호출하는 것을 봅니다. 구현 된 곳을 알고 있습니까? – SherCoder
왜 이것을 알고 싶습니까? 그것의 완벽하게 null 문자열을 쓸 writeString (null)을 호출하려고하면 작동합니다, 여기에 btw : http://androidxref.com/4.4_r1/xref/frameworks/base/core/jni/android_os_Parcel.cpp#641 – pskink