如何使用Parceable?

时间:2015-09-21 22:23:09

标签: java android

我是Java新手,甚至是Android新手。我目前正在尝试使用另一个活动中的一个活动来访问对象。在StackOverflow和Google上搜索后,我决定使用Parcelable类。

在我的代码中,对象的类是Protag,引用该对象的变量的名称是hero。我编写了Parcelable方法,虽然我不确定它们与从对象访问数据的关系。

一项活动有:

myIntent.putExtra("heroData", hero);

myIntent有这样的东西:

heroP = (Protag) getIntent().getParcelableExtra("heroData");

但是,当myIntent尝试访问heroP.arbritraryInt时,它会返回0,而我无法从教程中了解我应该如何访问它。

如何在此上下文中使用Parceable类?

4 个答案:

答案 0 :(得分:1)

Parcelable确实是你需要的。它比Serializable更优化,但也需要大量代码

在这方面,我建议你看看这个方便的plugin。它将为您完成所有艰苦的工作,并在您的情况下避免在构建您的Parcelable时出错。

但是当你使用它的时候,你应该启动并运行你的对象,并且可以根据需要从你的Bundle访问你的属性。

祝你好运

答案 1 :(得分:1)

处理parceling的另一个好方法是Parceler库。

https://github.com/johncarl81/parceler

它会使你的apk更大,插件ptitvinou提到的不会,但优点是代码仍然非常简单易读,而不是正常的Android分区。

答案 2 :(得分:0)

我会使用http://www.parcelabler.com/来生成parcel代码而不是parceler这样的库,它们使用注释处理器并在每次构建时启动。

这只是个人偏好,Parceler非常好用且很有用。这也取决于你的项目。如果parcelables经常变化,Parceler应该是一个不错的选择。但是,如果只是一次,我认为用上述链接生成一次是一个不错的选择。

例如,您的班级就像:

package com.example.hero;

import java.util.ArrayList;

public class Hero {

    String heroName;

    int primaryWeapon;

    ArrayList<Integer> allWeapons;

    boolean canFly;

}

使用上面发布的链接进行转换,它会生成如下内容:

package com.example.hero;

import java.util.ArrayList;

public class Hero implements Parcelable {

    String heroName;

    int primaryWeapon;

    ArrayList<Integer> allWeapons;

    boolean canFly;


    protected Hero(Parcel in) {
        heroName = in.readString();
        primaryWeapon = in.readInt();
        if (in.readByte() == 0x01) {
            allWeapons = new ArrayList<Integer>();
            in.readList(allWeapons, Integer.class.getClassLoader());
        } else {
            allWeapons = null;
        }
        canFly = in.readByte() != 0x00;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(heroName);
        dest.writeInt(primaryWeapon);
        if (allWeapons == null) {
            dest.writeByte((byte) (0x00));
        } else {
            dest.writeByte((byte) (0x01));
            dest.writeList(allWeapons);
        }
        dest.writeByte((byte) (canFly ? 0x01 : 0x00));
    }

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

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

自己编写代码并不困难,但一旦你不得不一遍又一遍地做同样的事情就会变得单调乏味。

如果您在类中使用非原始字段,请确保它们实现Parcelable或Serializable

按照以下链接了解有关如何使用Parcelable的更多信息: https://guides.codepath.com/android/Using-Parcelable

希望有所帮助!

答案 3 :(得分:0)

Singleton Class方法

public class SingletonClass {

//Final Instance 
private static final SingletonClass SINGLETON_CLASS = new SingletonClass();

private MyObj myObj;

/**
 * Protected Constructor for Thread Safing
 */

protected SingletonClass(){
}

public static SingletonClass getInstance(){
    return SINGLETON_CLASS;
}

public MyObj getMyObj() {
    return myObj;
}

public void setMyObj(MyObj myObj) {
    this.myObj = myObj;
}

}

然后你就像这样存储你的对象:

SingletonClass.getInstance().setMyObj(myObj);

你找回它:

MyObj myObj = SingletonClass.getInstance().getMyObj;