【问题标题】:Android Parcelable write / read String List null object reference [duplicate]Android Parcelable 写入/读取字符串列表空对象引用 [重复]
【发布时间】:2016-10-13 00:43:32
【问题描述】:

我正在尝试读取字符串列表,但一直出现以下错误:

使用以下 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() 中的值时,列表中包含预期值。

【问题讨论】:

    标签: android nullpointerexception parcelable


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      使用此方法。

      Parcel.readStringList(List&lt;String&gt; list)

      读入给定的 List items 写入的 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);
      

      【讨论】:

      • 你是对的。我想构造对象。即使使用你所说的,它仍然无法正常工作。我正在使用您所说的并为列表添加了一个 set 方法。所以我可以给它一个价值。但仍然是 null...
      • 不知道该告诉你什么,但在某些时候你确实需要readStringList
      • 一个应用正在调用另一个返回 ActivePolicies 的远程方法。此远程应用程序具有列表值,因此我返回新的 ActivePolicies(list)。尽管如此,当 readStringList 被调用时,它仍然会与 null 混淆。
      • 那么当你做dest.writeStringList(activePolicies);时听起来列表已经为空了@
      • 其实试试更新
      猜你喜欢
      • 2013-04-10
      • 2019-11-16
      • 2012-10-16
      • 1970-01-01
      • 2019-03-03
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多