【问题标题】:Android - Parcel Custom Type - FAILED BINDER TRANSACTIONAndroid - 包裹自定义类型 - 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&lt;Songs&gt; 时,我得到了 FAILED BINDER TRANSACTION。作为一种解决方法,我正在使用静态变量。关于如何克服此解决方案并在 Intent 中传递 ArrayList&lt;Songs&gt; 的任何想法。

【问题讨论】:

    标签: java android arraylist parcelable


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的。我会这样做并检查。我遇到了一个 ImageLoader 库,我会看看。但总的来说,我的方法是否正确使该对象(使用 byte[])Parcelable?
    • @PsyGik:“我的方法正确地使该对象(使用 byte[])Parcelable 吗?” -- 如果“正确”是指“它会运行吗,如果你的ArrayList&lt;Songs&gt; 小到不能达到 1MB 的限制”,它看起来还可以。就个人而言,我不喜欢以这种方式在内部传递整个模型。恕我直言,您的模型本身应该是一个缓存,由一个单例管理,并且您在 Intent extras 中传递一些 ID 或键或其他内容。这样可以节省大量内存和 CPU 时间,因为您无需复制和重新复制、重新复制和重新复制和重新重新复制相同的模型对象。
    • 在类似的问题上需要帮助:stackoverflow.com/q/42062417/6144372
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 2014-10-20
    • 2018-04-23
    • 2018-07-04
    • 2022-10-15
    • 2018-07-13
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多