Parcelable 示例出错。

Parcelable example errors out.

有人建议我为我的 android class 项目使用 parcelable。在我将它实现到我的代码中之前,我想对它有一个实际的了解。我很难让这个例子工作,我已经列出了程序运行时的错误

 **Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.shawn.nichol.parcelabletest.Person.toString()' on a null object reference
    atcom.shawn.nichol.parcelabletest.SecondActivity.onCreate(SecondActivity.java:20**)

任何帮助将不胜感激,我已经在这里工作了 10 个小时。

主要活动

public class MainActivity extends AppCompatActivity {

    static String NAME_KEY = "NAME;";
    static String AGE_KEY = "AGE";
    static String USER_KEY = "USER";
    static String PERSON_KEY = "PERSON";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(MainActivity.this, SecondActivity.class);

        intent.putExtra(PERSON_KEY, new Person("Alice Smith",  25.0, 
        "Calgary"));

        startActivity(intent);
    }
}

人(可包裹)

public class Person implements Parcelable {
    String name;
    Double age;
    String city;

    public Person(String name, double age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", city='" + city + '\'' +
                '}';
    }

    protected Person(Parcel in) {
        this.name = in.readString();
        this.age = in.readDouble();
        this.city = in.readString();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel parcel) {
            return null;
        }

        @Override
        public Person[] newArray(int i) {
            return new Person[0];
        }
    };

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(this.name);
        parcel.writeDouble(this.age);
        parcel.writeString(this.city);
    }

}

第二个活动

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent i = getIntent();
        Person person = 
             getIntent().getExtras().getParcelable(MainActivity.PERSON_KEY);

        if(getIntent() != null && getIntent().getExtras() != null) {

            Log.d("Nichol", "Second activity " + person.toString());
        }
    }
}

在你的情况下,问题出在你的 CREATOR

public static final Creator<Person> CREATOR = new Creator<Person>() {
     @Override
     public Person createFromParcel(Parcel parcel) {
         return null;
     }
     ...
}

当您的 parcelable 加载您的 Person 时,它会调用您的 Creator - return是一个空人。您需要return一个对象

public Person createFromParcel(Parcel parcel) {
     return new Person(parcel);
}

您的 parcelable Creator 实施是错误的。试试这个:

public class Person implements Parcelable, Parcelable {
    String name;
    Double age;
    String city;

    public Person(String name, double age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", city='" + city + '\'' +
                '}';
    }

    protected Person(Parcel in) {
        name = in.readString();
        age = in.readByte() == 0x00 ? null : in.readDouble();
        city = in.readString();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        if (age == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeDouble(age);
        }
        dest.writeString(city);
    }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
}