Android - 包裹自定义类型 - 失败的粘合剂交易

时间:2014-02-18 11:43:11

标签: java android arraylist parcelable

我正在开发一个媒体播放器应用程序,我正在使用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>的任何想法。

1 个答案:

答案 0 :(得分:2)

鉴于byte[] AlbumArt,您可能超过了1MB的IPC限制。

  

关于如何克服此解决方案并在Intent中传递ArrayList的任何想法。

我首先要摆脱AlbumArt。图像应该位于图像缓存中,旨在确保您不会因为最大大小而耗尽堆空间并删除最近最少使用的条目(或将它们移动到第二层磁盘缓存)。作为附带好处,将byte[]移出Parcelable可能会解决您的问题。