【问题标题】:Acessing object instanciated in an object passed as pacelable with intent访问在一个对象中实例化的对象,该对象被传递为具有意图的可打包对象
【发布时间】:2014-05-05 12:19:35
【问题描述】:

我对@9​​87654321@ 很陌生,并且有点挣扎。我使用 Intent 将实现 Parcelable 的类 Person 的对象传递给另一个活动。

这很好用,但是这个对象已经从Employer 类中实例化了一个对象,当尝试从第二个对象访问方法时,它会抛出一个NullPointerException。我猜是 Parcel 中没有包含 Employer 类对象。

有什么好的做法可以使这项工作发挥作用吗?我的实际代码比这复杂得多,所以我希望我不必重写整个应用程序 :-) 任何想法都非常感谢。

这是我无法开始工作的代码的简化示例:

在 MainActivity.java 中:

Person client = new Person();

Intent i = new Intent();
Bundle b = new Bundle();
b.putParcelable("person",(Person) client);
i.putExtras(b);
i.setClass(this, SecondActivity.class);
startActivity(i);

在 Person.java 中

class Person implements Parcelable{
    Company employer;
    String lastName;

    Person(){
        lastName = "Smith";
        employer = new Company("Burger King");
    }

    public String getLastName(){
        return lastName;
    }

    public String getEmployer(){
        return employer.getName();
    }

}

在 Company.class 中

class Company {
    String name;

    Company(String companyName){
        name = companyName;
    }

    public String getName(){
        return name;
    }
}

在 SecondActivity.java 中

Bundle b = this.getIntent().getExtras();
if(b!=null){
Person client = b.getParcelable("person");
String lastName = client.getLastName(); //works fine
String employer = client.getEmployer(); //thows NullPointerException

【问题讨论】:

    标签: android android-intent parcelable


    【解决方案1】:

    我认为您可以通过实现 CREATOR 字段来控制读取、写入和重新创建对象的方式:

    “类的接口,其实例可以从 Parcel 中写入和恢复。实现 Parcelable 接口的类还必须有一个名为 CREATOR 的静态字段,它是一个实现 Parcelable.Creator 接口的对象。”

    我认为该方法是让 Company 也可 Parcelable,或者以其他方式将公司的数据包含在 Person 的 writeToParcel() 中,然后在 Parcelable.Creator.createFromParcel() 中重新创建这两个对象。

    查看此链接,它有一个基本示例: http://developer.android.com/reference/android/os/Parcelable.html

    【讨论】:

    • 感谢您的回答。我在基本示例链接中包含了静态字段 CREATOR 和所有其他覆盖的方法,我只是不想用它弄乱我的示例代码。我也尝试让 Company 类实现 Parcelable,但没有任何运气。我没有尝试的是专门在 Person 类的 Parcelable.Creator.createFromParcel() 中重新创建“雇主”对象。这是要走的路吗?
    • 在示例中,Company 对象被创建并存在于 Person 类中。在这个例子中,我认为在重新创建 Person 时重新创建 Company 是可以的。
    • 如果 Company 是对位于 Person 之外的对象的引用,但该 Person 需要引用,则需要进行额外分析。请记住,作为 parcelables 传递的对象在读取时是不同的对象(内存空间),甚至可能位于不同的虚拟机(进程)中。
    • 好的。多谢你们。通过在实例化客户端对象时将employee.getName() 的结果存储在私有字段中并在访问getEmployer() 时返回此字段,将所有需要的数据存储在Parcel 中。但就我而言,这并不总是可能的。我会继续我的搜索:-)
    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 2013-09-10
    • 2018-02-18
    • 2018-12-13
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多