Android Parcelable写入/读取字符串列表空对象引用

时间:2016-10-13 00:43:32

标签: android nullpointerexception 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()返回之前对其进行评估时,列表中存在预期的值。

2 个答案:

答案 0 :(得分:0)

您需要创建接受Parcel的构造函数

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

答案 1 :(得分:0)

in.createStringArrayList()?为什么要在构造对象时创建新的String列表?

使用此方法。

  

Parcel.readStringList(List<String> list)

     

读入给定的List项目使用的String对象   当前dataPosition()的writeStringList(List)。

推荐:实现一个接受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);