我正在开发一个媒体播放器应用程序,我正在使用ArrayList
来存储歌曲列表,并希望在Service
和其他Activities
之间使用相同的列表。我编写了一个实现Parcelable
接口的自定义类型的歌曲。我就这样做了:
String ID, Title, Artist, Album, Genre, Duration, Path;
byte[] AlbumArt;
//constructors go here
//getters and setters go here
public Songs(Parcel in) {
readFromParcel(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(this.ID);
dest.writeString(this.Title);
dest.writeString(this.Artist);
dest.writeString(this.Album);
dest.writeString(this.Genre);
dest.writeString(this.Duration);
dest.writeByteArray(this.AlbumArt);
dest.writeString(this.Path);
}
private void readFromParcel(Parcel in) {
this.ID = in.readString();
this.Title = in.readString();
this.Artist = in.readString();
this.Album = in.readString();
this.Genre = in.readString();
this.Duration = in.readString();
in.readByteArray(this.AlbumArt);
this.Path = in.readString();
}
public static final Parcelable.Creator<Songs> CREATOR = new Parcelable.Creator<Songs>() {
@Override
public Songs createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new Songs(source); // using parcelable constructor
}
@Override
public Songs[] newArray(int size) {
// TODO Auto-generated method stub
return new Songs[size];
}
};
现在问题是当我尝试在意图中传递FAILED BINDER TRANSACTION
时,我得到Arraylist<Songs>
。作为一种解决方法,我使用的是静态变量。关于如何克服此解决方案并在意图中传递ArrayList<Songs>
的任何想法。
答案 0 :(得分:2)
鉴于byte[] AlbumArt
,您可能超过了1MB的IPC限制。
关于如何克服此解决方案并在Intent中传递ArrayList的任何想法。
我首先要摆脱AlbumArt
。图像应该位于图像缓存中,旨在确保您不会因为最大大小而耗尽堆空间并删除最近最少使用的条目(或将它们移动到第二层磁盘缓存)。作为附带好处,将byte[]
移出Parcelable
可能会解决您的问题。