2014-10-07 2 views
2

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의 예를 보자.

은 내가 대신 writeValuewriteString 사용할 수 있지만 writeString가 null이었다 NullPointerExceptionname 경우가 발생합니다 이해합니다.

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

+2

writeString (null)이 작동합니다. writeValue가 어떻게 구현되는지보십시오. http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/os/Parcel.java#1182 그냥 writeString을 사용합니다. 전달 된 인수가 – pskink

+0

@pskink입니다. writeString이 nativeWriteString을 호출하는 것을 봅니다. 구현 된 곳을 알고 있습니까? – SherCoder

+1

왜 이것을 알고 싶습니까? 그것의 완벽하게 null 문자열을 쓸 writeString (null)을 호출하려고하면 작동합니다, 여기에 btw : http://androidxref.com/4.4_r1/xref/frameworks/base/core/jni/android_os_Parcel.cpp#641 – pskink

답변

-1

내가이 캐릭터 name의 길이를 작성하는 것입니다 할 수있는 가장 좋은 방법을 생각 :

나는 보통 얻을 오류는 소포의 문자열 중 하나 읽을 때 어떤 일이 발생, 이것이다 name 전. name이 null 인 경우 길이로 0을 쓰고 name을 쓰지 마십시오. 읽을 때 length을 읽고 값이 0이면 name을 읽지 않고 namenull으로 설정하십시오.

+0

이것은 흥미 롭습니다. 그러나 내 모델에 많은 String 필드가 있으면 그 중 하나 하나마다 똑같이해야 할 것입니다. – SherCoder

0

ClassLoaderMyModel.class. getClassLoader()을 입력하는 것은 어떻습니까?

+0

예를 들어이 답변을 개선하는 데 도움이되지만 신고 할 이유가 없습니다. 당신이 그것을 좋아하지 않는다면, 투표하십시오. – ArtOfWarfare

+0

"flag"를 실수로 클릭했습니다. –

+0

어떻게 도움이 될까요? 설명이 도움이 될 것입니다. 감사. – SherCoder

2

사례에서 Parcel의 null 값을 읽는 가장 좋은 방법은 무엇입니까?

당신 캐릭터 고유의 방법을 사용할 수 있습니다

  • Parcel.writeString(String)
  • Parcel.readString()

그들은 null 값으로 완벽하게 잘 작동합니다.

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(id); 
    dest.writeString(null); // NOTE the null value here 
    dest.writeString(description); 
} 

protected Test(Parcel in) { 
    id = in.readInt(); 
    name = in.readString(); 
    description = in.readString(); 
} 
:

public class Test implements Parcelable { 
    public final int id; 
    private final String name; 
    public final String description; 
    ... 

당신은 (안드로이드 스튜디오 autoparcelable 도구를 사용하여)이 같은 Parcelable 구현을 만들 : 예를 들어


, 당신은 그 안에 다음과 같은 필드 클래스가 있다고 가정

Test.name 값은 캐스팅 없이도 null으로 올바르게 역 직렬화됩니다. String.