2016-10-13 51 views
-1

我想讀字符串列表,我不斷有以下錯誤:的Android Parcelable寫入/讀取字符串列表空對象引用

img

具有以下Parcelable類:

import java.util.List; 

import android.os.Parcel; 
import android.os.Parcelable; 

public class ActivePolicies implements Parcelable { 

    private List<String> activePolicies; 

    public ActivePolicies(List<String> activePolicies) { 
     this.activePolicies = activePolicies; 
    } 

    public List<String> getActivePolicies(){ 
     return activePolicies; 
    } 

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

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeStringList(activePolicies); 
    } 

    public static final Parcelable.Creator<ActivePolicies> CREATOR = new Parcelable.Creator<ActivePolicies>() { 
     @Override 
     public ActivePolicies createFromParcel(Parcel in) { 

      try { 
       return new ActivePolicies(in.createStringArrayList()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     @Override 
     public ActivePolicies[] newArray(int size) { 
      return new ActivePolicies[size]; 
     } 
    }; 

} 

它不斷給我例外createFromParcel(),但我不明白爲什麼。
它似乎是一個簡單的parcelable,但是當我從Parcel類的readStringList()調試時,該列表爲空。
但是,當我在createStringArrayList()中評估它返回之前的值時,該列表與預期值一起出現。

回答

0

您需要創建構造函數接受包裹

public ActivePolicies(Parcel in) { 
    in.readStringList(activePolicies); 
} 
0

in.createStringArrayList()?當你想構建你的對象時,爲什麼要創建一個新的字符串列表?

使用此方法。

Parcel.readStringList(List<String> list)

Read into the given List items String objects that were written with writeStringList(List) at the current dataPosition().

推薦:執行一個接受Parcel,然後構造器,任選的readFromParcel方法。

public class ActivePolicies implements Parcelable { 

    private List<String> activePolicies; 

    public ActivePolicies() { 
     activePolicies = new ArrayList<String>(); 
    } 

    public ActivePolicies(Parcel in) { 
     this(); 
     readFromParcel(in); 
    } 

    private void readFromParcel(Parcel in) { 
     in.readStringList(activePolicies); 
    } 

在創建者。

return new ActivePolicies(in); 
+0

你說得對。我想構建這個對象。即使使用你所說的,它仍然不能工作。我正在使用你所說的,併爲列表添加了一個設置方法。所以我可以給它一個價值。但仍然爲空... – fcarvalho

+0

不知道該告訴你什麼,但你確實需要'readStringList'在某個點 –

+0

一個應用程序正在調用另一個返回ActivePolicies的遠程方法。這個遠程應用程序具有列表值,所以我返回新的ActivePolicies(列表)。儘管在readStringList被調用時,它仍然與null混淆。 – fcarvalho

相關問題