【问题标题】:Java , Android: ClassCastException after Intent [duplicate]Java,Android:Intent后的ClassCastException [重复]
【发布时间】:2016-04-01 06:01:03
【问题描述】:

我有班级播放列表

public class Playlist extends ArrayList<Track> implements Serializable {

    String module;
    String name, playlistId;

    public Playlist(String name) {
        super();
        this.name = name;
    }
    ...
}

我尝试将其赋予 Intent:

...
Intent intent = new Intent(this, PlaylistActivity.class);
intent.putExtra("playlist", Modul.loaded[id].getPlaylist(pId)); //Return Playlist
startActivity(intent);

当我尝试获取播放列表时:

Intent intent = getIntent();
playlist = (Playlist) intent.getSerializableExtra("playlist");

在这里我得到了这个错误:

Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.timia2109.nukla.Playlist

但它必须是一个播放列表,因为我将它创建为一个播放列表,我不会将它转换为带有 Intent 的 Serializable。 我在互联网上没有找到解决方案,但我没有找到任何东西。

或者有没有办法做到这一点:

PlaylistActivity pa = new PlaylistActivity();
pa.setPlaylist( playlist );
//And now start this Activity

谢谢!

【问题讨论】:

    标签: java android android-intent classcastexception


    【解决方案1】:

    有一个与此相关的old bug 现在被标记为已过时。我不知道这是否仍然是一个问题。最简单的解决方案当然是手动处理(重新)创建对象

    理想情况下,首先将您的实现更改为 Parcelable 类似于以下内容,类似于我过去使用的内容

    public static class Playlist extends ArrayList<Track> implements Parcelable {
    
        String module;
        String name, playlistId;
    
        public Playlist(String name) {
            super();
            this.name = name;
        }
    
        protected Playlist(Parcel in) {
            module = in.readString();
            name = in.readString();
            playlistId = in.readString();
            //this line you might need to tweak & error handle, I've jsut written this from memory
            super.addAll( (Collection<? extends Track>) Arrays.asList( in.readParcelableArray(Track.class.getClassLoader() )) );
        }
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(module);
            dest.writeString(name);
            dest.writeString(playlistId);
            dest.writeParcelableArray(toArray(new Track[size()]), flags);
        }
    
        public static final Creator<Playlist> CREATOR = new Creator<Playlist>() {
            @Override
            public Playlist createFromParcel(Parcel in) {
                return new Playlist(in);
            }
    
            @Override
            public Playlist[] newArray(int size) {
                return new Playlist[size];
            }
        };
    
    }
    

    偏爱parcelable的原因是explained well here

    您的接收活动应该更好地处理包裹。无论您决定让您的对象 Parcelable 与否,您都可以自己处理游戏,如下所示

    public static class Playlist ... {
    
        public Playlist(ArrayList<Track> arrList) {
            super( arrList );
        }
    
        ....
    }
    

    并使用

    Intent intent = getIntent();
    ArrayList<Track> arrList = (ArrayList<Track>) intent.getSerializableExtra("playlist");
    playlist = new Playlist(arrList);
    

    您只需要针对您拥有的额外两个字段进行修改,并注意当您尝试将其写入意图时,它可能会抱怨泛型,因此只需在设置额外字段时手动转换为 parcelable/serializable :

    intent.putExtra("playlist", (Parcelable) Modul.loaded[id].getPlaylist(pId));
    

    【讨论】:

    • 谢谢!那行得通:)但我只是这样理解:protected Playlist(Parcel in) { module = in.readString();名称 = in.readString(); playlistId = in.readString(); //这条线你可能需要调整和错误处理,我已经从内存中写了这个 List load = Arrays.asList( in.readParcelableArray(Track.class.getClassLoader() ) ); for (int i=0; i
    猜你喜欢
    • 2018-08-15
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多