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&lt;Songs&gt; 时,我得到了 FAILED BINDER TRANSACTION。作为一种解决方法,我正在使用静态变量。关于如何克服此解决方案并在 Intent 中传递 ArrayList&lt;Songs&gt; 的任何想法。

【问题讨论】:

【参考方案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 时间,因为您无需复制和重新复制、重新复制和重新复制和重新重新复制相同的模型对象。 在类似的问题上需要帮助:***.com/q/42062417/6144372

以上是关于Android - 包裹自定义类型 - BINDER TRANSACTION 失败的主要内容,如果未能解决你的问题,请参考以下文章

设置自定义对话框的宽度以包装内容android

自定义 Android 视图在线性和相对布局中显示不同

Kendo MVVM 和绑定或扩展自定义事件

Flutter 小部件包裹在自定义小部件中

[Android] 自定义 Dialog 布局设置固定宽高无效

带有自定义组件的角包裹角材料标签组件