Java 如何使用可包裹的?
我对Java是新手,甚至对Android也是新手。我当前正在尝试从另一个活动访问具有一个活动的对象。在StackOverflow和Google上搜索之后,我决定使用Java 如何使用可包裹的?,java,android,Java,Android,我对Java是新手,甚至对Android也是新手。我当前正在尝试从另一个活动访问具有一个活动的对象。在StackOverflow和Google上搜索之后,我决定使用Parcelable类 在我的代码中,对象的类是Protag,引用对象的变量的名称是hero。我已经编写了Parcelable方法,尽管我不确定它们与从对象访问数据的关系 其中一项活动有: myIntent.putExtra("heroData", hero); 我的意图是这样的: heroP = (Protag) getInten
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年代很流行。单身是一个阶级…这是一种普遍的做法。重要的是你要用正确的方法来构建它。我将向您发布一个带有线程安全的优秀单例类的框架