Android - 包裹自定义类型 - BINDER TRANSACTION 失败
Posted
技术标签:
【中文标题】Android - 包裹自定义类型 - BINDER TRANSACTION 失败【英文标题】:Android - Parcel Custom Type - FAILED BINDER TRANSACTION 【发布时间】:2014-02-18 11:43:11 【问题描述】:我正在开发一个媒体播放器应用程序,我使用ArrayList
来存储歌曲列表,并希望在Service
和其他Activities
之间使用相同的列表。我编写了一个自定义类型 Songs 实现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];
;
现在的问题是,当我尝试在 Intent 中传递 Arraylist<Songs>
时,我得到了 FAILED BINDER TRANSACTION
。作为一种解决方法,我正在使用静态变量。关于如何克服此解决方案并在 Intent 中传递 ArrayList<Songs>
的任何想法。
【问题讨论】:
【参考方案1】:鉴于byte[] AlbumArt
,您可能超过了 1MB IPC 限制。
关于如何克服此解决方案并在 Intent 中传递 ArrayList 的任何想法。
我会先摆脱AlbumArt
。图像应该位于图像缓存中,旨在确保您不会通过设置最大大小并删除最近最少使用的条目(或将它们移动到第二层磁盘缓存)来确保您不会耗尽堆空间。作为附带的好处,将byte[]
移出Parcelable
可能会解决您的问题。
【讨论】:
好的。我会这样做并检查。我遇到了一个 ImageLoader 库,我会看看。但总的来说,我的方法是否正确使该对象(使用 byte[])Parcelable? @PsyGik:“我的方法正确地使该对象(使用 byte[])Parcelable 吗?” -- 如果“正确”是指“它会运行吗,如果你的ArrayList<Songs>
小到不能达到 1MB 的限制”,它看起来还可以。就个人而言,我不喜欢以这种方式在内部传递整个模型。恕我直言,您的模型本身应该是一个缓存,由一个单例管理,并且您在 Intent
extras 中传递一些 ID 或键或其他内容。这样可以节省大量内存和 CPU 时间,因为您无需复制和重新复制、重新复制和重新复制和重新重新复制相同的模型对象。
在类似的问题上需要帮助:***.com/q/42062417/6144372以上是关于Android - 包裹自定义类型 - BINDER TRANSACTION 失败的主要内容,如果未能解决你的问题,请参考以下文章