2011-11-09 4 views
1

서비스와 활동이있는 응용 프로그램이 있습니다. 내 기본 클래스 및 목록 클래스 parcelable 구현하고 있습니다. 그리고 목록 클래스는 writeTypedList()/readTypedList()를 사용하여 사용자 지정 목록을 소포합니다. 그러나 목록을 검색 할 때 올바른 요소 수를 얻고 있지만 목록의 첫 번째 요소 외에 다른 요소에 액세스하려고 할 때 널 포인터 예외가 발생합니다. writeToParcel()을 수행 할 때 올바른 데이터가있는 두 요소가 추가되는 것을 볼 수 있지만 readFromParcel()을 수행 할 때 첫 번째 요소 만 표시되고 두 번째 요소는 null입니다.구분할 수있는 객체를 사용할 때 목록 요소를 가져올 수 없습니다.

도움이 될 것입니다. 내가 문제를 발견했다고 생각

public class WfdDeviceList implements Parcelable { 
private static final String TAG = "WfdDeviceList"; 
public List<WfdDevice> devList; 

public WfdDeviceList() { devList = new ArrayList<WfdDevice>(); } 
public WfdDeviceList(Parcel parcel) { 
    this(); 
    readFromParcel(parcel); 
} 

public void clear() { 
    devList.clear(); 
} 

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

@Override 
public void writeToParcel(Parcel parcel, int flags) { 
    Log.d(TAG, "writeToParcel(): " + devList.size()); 
    Log.d(TAG, "flags: " + flags); 
    for (WfdDevice device : devList) { 
     Log.d(TAG, "Writing: " + device.name); 
    } 
    parcel.writeTypedList(devList); 
} 

public void readFromParcel(Parcel parcel) { 
    Log.d(TAG, "readFromParcel()"); 
    parcel.readTypedList(devList, WfdDevice.CREATOR); 
    Log.d(TAG, "Size: " + devList.size()); 
    WfdDevice device = devList.get(0); 
    Log.d(TAG, "Device1: " + device.name); 
} 

public static final Parcelable.Creator<WfdDeviceList> CREATOR = new Parcelable 
.Creator<WfdDeviceList>() { 
    public WfdDeviceList createFromParcel(Parcel in) { 
     return new WfdDeviceList(in); 
    } 
    public WfdDeviceList[] newArray(int size) { 
     return new WfdDeviceList[size]; 
    } 
}; 
} 

public class WfdDevice implements Parcelable { 
public String macAddress; 
public String name; 
public WfdDeviceType type; 
public String ipAddr; 
public String pin; 
public boolean isConnected; 

public WfdDevice() {} 
    public WfdDevice(Parcel parcel) { 
    readFromParcel(parcel); 
} 

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

WfdDeviceType getType(int type) { 
    switch(type) { 
    case 1: 
     return WfdDeviceType.source; 
    case 2: 
     return WfdDeviceType.primarySink; 
    case 3: 
     return WfdDeviceType.secondarySink; 
    case 4: 
     return WfdDeviceType.sourcePrimarySink; 
    default: 
    case 0: 
     return WfdDeviceType.unknown; 
    } 
} 

@Override 
public void writeToParcel(Parcel parcel, int flags) { 
    parcel.writeString(this.macAddress); 
    parcel.writeString(this.name); 
    parcel.writeInt(type.ordinal()); 
    parcel.writeString(this.ipAddr); 
    parcel.writeString(this.pin); 
    parcel.writeInt(this.isConnected == true ? 1 : 0); 
} 

public void readFromParcel(Parcel parcel) { 
    this.macAddress = parcel.readString(); 
    this.name = parcel.readString(); 
    this.type = getType(parcel.readInt()); 
    this.ipAddr = parcel.readString(); 
    this.pin = parcel.readString(); 
    this.isConnected = (parcel.readInt() == 1 ? true : false); 
} 

public static final Parcelable.Creator<WfdDevice> CREATOR = new Parcelable 
.Creator<WfdDevice>() { 
    public WfdDevice createFromParcel(Parcel in) { 
     return new WfdDevice(in); 
    } 
    public WfdDevice[] newArray(int size) { 
     return new WfdDevice[size]; 
    } 
}; 
} 

답변

1

:

여기 내 목록의 컨테이너 클래스입니다. 내 WfdDevice 클래스에서 열거 형 WfdDeviceType을 갖는 것이 어떻게 든 문제를 일으킨 것으로 보입니다. 그 이후이 타입을 enum에서 int로 바꾸었고 문제가 사라졌습니다.