安卓 - 包裹自定义类型 - 绑定事务失败

3

我正在开发一个媒体播放器应用程序,其中使用 ArrayList 存储歌曲列表,并希望在 Service 和其他 Activities 之间使用相同的列表。 我编写了一个实现 Parcelable 接口的自定义类型 Songs。下面是我的做法:

     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时,我会收到“FAILED BINDER TRANSACTION”的错误消息。作为解决方法,我正在使用静态变量。有没有什么办法可以克服这个问题,并将ArrayList传递给Intent?

在这种情况下,我使用了全局静态变量,问题得到了解决。你可以从这篇Stack Overflow帖子中获取灵感。 - Noor Hossain
1个回答

3
给定 byte[] AlbumArt,您可能超过了1MB的IPC限制。
有什么想法可以克服这个问题并将ArrayList传递给Intent吗?
我会从去除AlbumArt开始。图像应该在一个图片缓存中,这样设计可以确保您不会因为最大大小而用尽堆空间,并且通过删除最近未使用的条目(或将它们移到二级磁盘缓存)来清除Parcelable中的byte[],作为一个附带的好处,这可能会解决您的问题。

好的,我会这样做并检查。我已经遇到了一个ImageLoader库,我会看一下。但总的来说,我的方法正确吗,可以将该对象(带有byte [])设置为Parcelable? - PsyGik
@PsyGik:“我的方法是否正确,可以将该对象(带有byte[])设置为Parcelable?”--如果您的ArrayList<Songs>足够小,不会超过1MB的限制,那么它看起来是可以的。就个人而言,我不太喜欢以这种方式在内部传递整个模型。在我看来,您的模型本身应该是一个缓存,由单例管理,并在Intent extras中传递一些ID或键之类的东西。这样可以节省大量内存和CPU时间,因为您不需要复制、重新复制、重新重新复制和重新重新重新复制相同的模型对象。 - CommonsWare
需要帮助解决类似的问题:http://stackoverflow.com/q/42062417/6144372 - Hammad Nasir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接