2015-09-22 3 views
0

Вот мой локальный выход.android.os.BadParcelableException при передаче объекта arraylist через helpl

09-22 11:12:11.985: E/AndroidRuntime(6208): FATAL EXCEPTION: Thread-4521 
    09-22 11:12:11.985: E/AndroidRuntime(6208): Process: com.acsia.mediaservice:remote, PID: 6208 
    09-22 11:12:11.985: E/AndroidRuntime(6208): android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.acsia.mediaservice.model.Song 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at android.os.Parcel.readException(Parcel.java:1467) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at android.os.Parcel.readException(Parcel.java:1419) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at com.acsia.hmi.IMediaHmi$Stub$Proxy.getPlayListCallBack(IMediaHmi.java:210) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at com.acsia.mediaservice.MediaNotificationHandler.broadcastPlaylist(MediaNotificationHandler.java:175) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at com.acsia.mediaservice.MediaNotificationHandler.broadcastStartUp(MediaNotificationHandler.java:161) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at com.acsia.mediaservice.MediaService$3.run(MediaService.java:253) 
    09-22 11:12:11.985: E/AndroidRuntime(6208):  at java.lang.Thread.run(Thread.java:841) 

Что я пытаюсь сделать, это у меня есть модель класса callsed песня, которая реализует Parcelable следующим образом:

public class Song implements Parcelable { 
    String albumID; 
    String songTitle; 
    String displayName; 
    String duration; 
    String artist; 
    String songPath; 
    String albumPath; 

    public String getAlbumID() { 
     return albumID; 
    } 

    public void setAlbumID(String albumID) { 
     this.albumID = albumID; 
    } 

    public String getSongTitle() { 
     return songTitle; 
    } 

    public void setSongTitle(String songTitle) { 
     this.songTitle = songTitle; 
    } 

    public String getDisplayName() { 
     return displayName; 
    } 

    public void setDisplayName(String displayName) { 
     this.displayName = displayName; 
    } 

    public String getDuration() { 
     return duration; 
    } 

    public void setDuration(String duration) { 
     this.duration = duration; 
    } 

    public String getArtist() { 
     return artist; 
    } 

    public void setArtist(String artist) { 
     this.artist = artist; 
    } 

    public String getSongPath() { 
     return songPath; 
    } 

    public void setSongPath(String songPath) { 
     this.songPath = songPath; 
    } 

    public String getAlbumPath() { 
     return albumPath; 
    } 

    public void setAlbumPath(String albumPath) { 
     this.albumPath = albumPath; 
    } 

    @Override 
    public int describeContents() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public Song() { 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(albumID); 
     dest.writeString(songTitle); 
     dest.writeString(displayName); 
     dest.writeString(duration); 
     dest.writeString(artist); 
     dest.writeString(songPath); 
     dest.writeString(albumPath); 
    } 

    public static final Parcelable.Creator<Song> CREATOR = new Parcelable.Creator<Song>() { 
     public Song createFromParcel(Parcel in) { 
      return new Song(in); 
     } 

     public Song[] newArray(int size) { 
      return new Song[size]; 
     } 
    }; 
    private Song(Parcel in) { 
     albumID = in.readString(); 
     songTitle = in.readString(); 
     displayName = in.readString(); 
     duration = in.readString(); 
     artist = in.readString(); 
     songPath = in.readString(); 
     albumPath = in.readString(); 
    } 

    @Override 
    public String toString() { 
     return "Song [albumID=" + albumID + ", songTitle=" + songTitle + ", displayName=" + displayName + ", duration=" 
       + duration + ", artist=" + artist + ", songPath=" + songPath + ", albumPath=" + albumPath + "]"; 
    } 
} 

в моем aidl у меня есть метод

void getPlayListCallBack(in Intent data); 

и я называю это

if (mediaHmi != null && serviceConnection != null) { 
       System.out.println("broadcastStartUp intent: "+from); 
       Intent intent = new Intent(); 
       intent.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) MediaDataManager.getInstance().getMediasList()); 
       mediaHmi.getPlayListCallBack(intent);//MediaDataManager.getInstance().getPlayList()); 
      } 

я получаю ошибку в этой строке intent.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) MediaDataManager.getInstance().getMediasList());

+0

Вы пробовали 'MediaDataManager.getInstance(). GetMediasList()'? –

+0

Все, что мне нужно, это отправить arraylist объектов класса Song через helpl. Альтернативные методы, отличные от использования намерения, также приветствуются ... –

+0

Да, я пробовал это –

ответ

0
intent.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) MediaDataManager.getInstance().getMediasList()); 

изменить его на

intent.putParcelableArrayListExtra("data", (ArrayList<Song>) MediaDataManager.getInstance().getMediasList()); 

Использование parcelable он не принимает общие данные типа вас должен использовать конкретный объект для посылки.

+0

Мне нужно прочитать его так: data.setExtrasClassLoader (Song.class.getClassLoader()); (Collection ) data.getExtras(). GetParcelableArrayList ("data") ' –

0

я получил решение, перейдя через исходный код, предоставленный в следующей ссылке

https://code.google.com/p/android-aidl-ipc-rpc-example/downloads/detail?name=AIDLParcelableExample.zip

Вместо использования Intent для передачи значений через aidl я использовал список Сун класса, т.е., я заменил void getPlayListCallBack(in Intent data); в aidl с void getPlayListCallBack(in List<Song> data); и создал Song.aidl следующим

package <package name>; 

/* Declare our Song as a class which implements the Parcelable interface */ 
parcelable Song; 

и теперь я могу просто отправить список, как это ... Надеюсь, что это помогает кто-то ...

Смежные вопросы