Java 如何使用可包裹的?

Java 如何使用可包裹的?,java,android,Java,Android,我对Java是新手,甚至对Android也是新手。我当前正在尝试从另一个活动访问具有一个活动的对象。在StackOverflow和Google上搜索之后,我决定使用Parcelable类 在我的代码中,对象的类是Protag,引用对象的变量的名称是hero。我已经编写了Parcelable方法,尽管我不确定它们与从对象访问数据的关系 其中一项活动有: myIntent.putExtra("heroData", hero); 我的意图是这样的: heroP = (Protag) getInten

我对Java是新手,甚至对Android也是新手。我当前正在尝试从另一个活动访问具有一个活动的对象。在StackOverflow和Google上搜索之后,我决定使用
Parcelable

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

其中一项活动有:

myIntent.putExtra("heroData", hero);
我的意图是这样的:

heroP = (Protag) getIntent().getParcelableExtra("heroData");
然而,当myIntent试图访问
heroP.arbritraryInt
时,它返回
0
,我无法从教程中理解应该如何访问它


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

Parcelable确实是您需要的。它比可序列化的优化得多,但也需要大量代码

在这方面,我建议你看看这个方便。它将为您完成所有艰苦的工作,并在您的情况下避免错误,同时建立您的包裹

但是当您使用它时,您应该根据需要启动并运行您的对象和您的属性,这些对象和属性可以从您的包中访问


祝你好运

另一种处理包裹的好方法是包裹员图书馆

它会让你的apk变得更大,而ptitvinou提到的插件不会,但优点是代码仍然非常简单,易于阅读,这与普通的Android parceling不同。

我将使用它来生成包裹代码,而不是像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;
导入java.util.ArrayList;
公众阶级英雄{
字符串名称;
主要武器;
ArrayList所有武器;
布尔能飞;
}
使用上面发布的链接将其转换,它将生成如下内容:

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];
        }
    };
}
package com.example.hero;
导入java.util.ArrayList;
公共类英雄实现Parcelable{
字符串名称;
主要武器;
ArrayList所有武器;
布尔能飞;
受保护英雄(包裹中){
heroName=in.readString();
primarywearm=in.readInt();
if(in.readByte()==0x01){
AllArrayList=新的ArrayList();
in.readList(allarms,Integer.class.getClassLoader());
}否则{
所有武器=空;
}
canFly=in.readByte()!=0x00;
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地记录(heroName);
目标写入(主要武器);
如果(所有武器==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
目标书面列表(所有武器);
}
dest.writeByte((字节)(canFly?0x01:0x00));
}
@抑制警告(“未使用”)
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
public Hero createFromParcel(包裹中){
返回新英雄(中);
}
@凌驾
公共英雄[]新数组(整数大小){
返回新英雄[大小];
}
};
}
自己编写代码并不困难,但一旦你不得不一遍又一遍地做同样的事情,代码就会变得单调乏味

如果在类中使用非基本字段,请确保它们实现了Parcelable或Serializable

按照以下链接了解有关如何使用Parcelable的更多信息:


希望有帮助

单例类方法

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;

如果你愿意的话,我可以引导你完成包裹过程,但是你可以得到同样的结果,构建一个强大的单例类……你可以用很少的钱让它存储你想要的任何对象hassle@Johan作为全局变量的单例?全球变量在80年代很流行。单身是一个阶级…这是一种普遍的做法。重要的是你要用正确的方法来构建它。我将向您发布一个带有线程安全的优秀单例类的框架