Java 如何在中创建地块?
我有一个叫做MusicFile的类,它的构造函数是:Java 如何在中创建地块?,java,android,Java,Android,我有一个叫做MusicFile的类,它的构造函数是: protected MusicFile(Parcel in) { Title = in.readString(); Album = in.readString(); Artist = in.readString(); Path = in.readString(); Genre = in.readString(); Data = in.readStr
protected MusicFile(Parcel in) {
Title = in.readString();
Album = in.readString();
Artist = in.readString();
Path = in.readString();
Genre = in.readString();
Data = in.readString();
artistID = in.readInt();
if (in.readByte() == 0) {
AlbumID = null;
} else {
AlbumID = in.readLong();
}
albumCover = in.readParcelable(Uri.class.getClassLoader());
}
但是现在我已经扩展了Parcelable
,我不能像这样创建一个新的音乐文件:
MusicFile MusicFile=new MusicFile()代码>
因为它需要在
中包含地块
现在如何创建新的音乐文件?我尝试了以下方法:
`
地块=新地块()
MusicFile MusicFile=新的MusicFile(包裹);
`
然而,这似乎不起作用。我得到以下错误:“packet(long)”在“android.os.packet”中不是公共的。无法从软件包外部访问
正确的方法是什么?您可以扩展Parcelable
并保留默认构造函数
import android.os.Parcel;
import android.os.Parcelable;
public class MusicFile implements Parcelable {
private Integer id;
private String title;
...
public MusicFile(Integer id, String title) {
this.id = id;
this.title = title;
}
public MusicFile(){
}
protected MusicFile(Parcel in) {
id = in.readByte() == 0x00 ? null : in.readInt();
title = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
if (id == null) {
dest.writeByte((byte) (0x00));
} else {
dest.writeByte((byte) (0x01));
dest.writeInt(id);
}
dest.writeString(title);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<MusicFile> CREATOR = new Parcelable.Creator<MusicFile>() {
@Override
public MusicFile createFromParcel(Parcel in) {
return new MusicFile(in);
}
@Override
public MusicFile[] newArray(int size) {
return new MusicFile[size];
}
};
}
导入android.os.packet;
导入android.os.Parcelable;
公共类MusicFile实现可包裹{
私有整数id;
私有字符串标题;
...
公共音乐文件(整数id,字符串标题){
this.id=id;
this.title=标题;
}
公共音乐文件(){
}
受保护的音乐文件(包裹中){
id=in.readByte()==0x00?null:in.readInt();
title=in.readString();
}
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
if(id==null){
目标写入字节((字节)(0x00));
}否则{
目标写入字节((字节)(0x01));
目的地写入(id);
}
目的书面记录(标题);
}
@抑制警告(“未使用”)
public static final Parcelable.Creator=新建Parcelable.Creator(){
@凌驾
公共音乐文件createFromParcel(包裹中){
返回新的音乐文件(in);
}
@凌驾
公共音乐文件[]新数组(整数大小){
返回新的音乐文件[大小];
}
};
}
当您在bundle中传递对象时,类Parcel
由Android处理,如bundle.addParcelableExtra(…)
。你不应该试图独自处理这些事情。当您调用addParcelableExtra()
Android使用这些方法(writeToParcel
,describeContents
,等等)来序列化您的对象,但是完全取决于框架。您应该添加这些方法来帮助Android自动序列化您的对象(并使您免于许多痛苦),但您需要保留标准构造函数、getter/setter等。您需要为parcelable创建一个空构造函数。您的模型现在应该如下所示:
public static final Creator<MusicFile> CREATOR = new Creator<MusicFile>() {
@Override
public MusicFilecreateFromParcel(Parcel in) {
return new MusicFile(in);
}
@Override
public ClassModelInfo[] newArray(int size) {
return new ClassModelInfo[size];
}
};
// It's an empty constructor for parcelable
private MusicFile() {
}
// This constructor is what parcel generates.
protected MusicFile(Parcel in) {
Title = in.readString();
Album = in.readString();
Artist = in.readString();
Path = in.readString();
Genre = in.readString();
Data = in.readString();
artistID = in.readInt();
if (in.readByte() == 0) {
AlbumID = null;
} else {
AlbumID = in.readLong();
}
albumCover = in.readParcelable(Uri.class.getClassLoader());
}
public静态最终创建者=新创建者(){
@凌驾
公共音乐文件CreateFromParcel(包裹中){
返回新的音乐文件(in);
}
@凌驾
公共ClassModelInfo[]新数组(整数大小){
返回新的ClassModelInfo[size];
}
};
//它是parcelable的空构造函数
私人音乐文件(){
}
//此构造函数是parcel生成的。
受保护的音乐文件(包裹中){
Title=in.readString();
Album=in.readString();
Artist=in.readString();
Path=in.readString();
Genre=in.readString();
Data=in.readString();
artistID=in.readInt();
如果(in.readByte()==0){
AlbumID=null;
}否则{
AlbumID=in.readLong();
}
albumCover=in.readParcelable(Uri.class.getClassLoader());
}
您可以使用获取包裹。别忘了做点什么
包裹回收()
用完后。当然!我忘记了Java可以有多个构造函数