2016-08-23 2 views
1

J'utilise Parcelable pour un objet Song personnalisé que j'ai dans ma classe. Cependant, quand j'essaie d'obtenir une liste supplémentaire de type Song, je reçois toujours une exception de pointeur nul. Je n'ai aucun problème à obtenir des extras de chaîne à partir de l'intention mais quand j'essaye d'obtenir cette ArrayList j'ai besoin de toujours obtenir la valeur null. Je reçois également une valeur nulle lorsque j'essaie juste de passer un objet Song, donc je suppose qu'il y a un problème avec ça mais je ne peux pas le comprendre pour la vie de moi.getParcelableArrayExtra null pointeur

C'est ma classe de chanson

import android.os.Parcel; 
import android.os.Parcelable; 
public class Song implements Parcelable { 
    private String uri; 
    private String title; 
    private String artist; 
    private String album; 
    private String length; 
    private int count; 
    private int source; 

    public Song() { 

    } 
    public Song (String title, String artist, String album, String uri, String length, int count, 
       int source) { 
     this.uri = uri; 
     this.title = title; 
     this.artist = artist; 
     this.album = album; 
     this.length = length; 
     this.count = count; 
     this.source = source; 
    } 

    public String getUri() { 
     return uri; 
    } 

    public String getArtist() { 
     return artist; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getLength() { 
     return length; 
    } 

    public int getCount() {return count;} 
    @Override 
    public String toString() { 
     return title + " - " +artist; 
    } 

    @Override 
    public boolean equals(Object o){ 
     if (o instanceof Song) { 
      Song song = (Song) o; 
      if (title.equals(song.title) && length.equals(song.length)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public int compareTo(Song s) { 
     if (this.count < s.getCount()) { 
      return -1; 
     } 
     else if(this.count > s.getCount()){ 
      return 1; 
     } 

     return 0; 
    } 


    public String getAlbum() { 
     return album; 
    } 

    public void setAlbum(String album) { 
     this.album = album; 
    } 

    public int getSource() { 
     return source; 
    } 


    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.uri); 
     dest.writeString(this.title); 
     dest.writeString(this.artist); 
     dest.writeString(this.album); 
     dest.writeString(this.length); 
     dest.writeInt(this.count); 
     dest.writeInt(this.source); 
    } 

    protected Song(Parcel in) { 
     this.uri = in.readString(); 
     this.title = in.readString(); 
     this.artist = in.readString(); 
     this.album = in.readString(); 
     this.length = in.readString(); 
     this.count = in.readInt(); 
     this.source = in.readInt(); 
    } 

    public static final Creator<Song> CREATOR = new Creator<Song>() { 
     @Override 
     public Song createFromParcel(Parcel source) { 
      return new Song(source); 
     } 

     @Override 
     public Song[] newArray(int size) { 
      return new Song[size]; 
     } 
    }; 
} 

Ceci est la ligne que j'utilise pour emballer le arraylist

Intent intent = new Intent(); 
     Log.d("UTILS ", " size: " +queue.size()); // Making sure it is not null before passing 
     intent.setClass(context, PlayerService.class); 
     intent.putParcelableArrayListExtra(PlayerService.EXTRA_TRACK_LIST, queue); 
     context.startService(intent); 

Ce récupère la arraylist en classe PlayerService

public static final String EXTRA_TRACK_LIST = "EXTRA_TRACK_LIST"; 
private ArrayList<Song> trackList; 
    . 
    . 
    . 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     if (intent == null || intent.getAction() == null) { 
      Log.d(TAG, "unspecified command"); 
      return START_STICKY; 
     } 

     trackList=intent.getParcelableArrayListExtra(PlayerService.EXTRA_TRACK_LIST); 
     if (trackList == null) { 
      Log.d("TRACKLIST", "IS NULL"); 
     } else { 
      Log.d(TAG, "size: "+trackList.size()); 
     } 
     . 
     . 
     . 
     // more irrelevant code 
+0

vous passez d'une activité au service? –

+0

@SohailZahid en quelque sorte. Je passe d'une vue personnalisée qui appelle la méthode via un fragment pour passer l'arraylist au service. – osharifali

+0

votre service étendent 'Intent service' ou juste' service'? –

Répondre

0

votre paramètre est faux

public static final Chaîne EXTRA_TRACK_LIST = "EXTRA_TRACK_LIST";

donc changer comme ça

trackList = intent.getParcelableArrayListExtra(PlayerService.EXTRA_TRACK_LIST); 
+0

J'ai essayé les deux façons. Cela ne fait pas de différence car la variable est définie dans cette classe. – osharifali

+0

@Override public int onStartCommand (intention d'intention, int flags, int startId) { handleCommand (intention); // Nous voulons que ce service continue à fonctionner jusqu'à ce qu'il soit explicitement // arrêté, donc revenez en arrière. return START_STICKY; } – sasikumar

+0

recevoir dans startcommand en service – sasikumar

0

est-file d'attente d'une file d'attente/Liste ou similaire? Ou est-ce un tableau? Si tableau, devrait être file.length, non? De la liste au tableau, essayez this. Cela devrait fonctionner.

intent.putParcelableArrayListExtra(PlayerService.EXTRA_TRACK_LIST, queue); 

Si non, faites le moi savoir pour continuer d'essayer. En outre, vous pouvez également passer en tant que chaîne. Vous pouvez utiliser GSON pour le convertir en chaîne JSON. Après avoir été converti en chaîne, passez-le en tant que chaîne unique.

Intent intent = new Intent(ActivityA.this, Service.class); 
intent.putExtra(new Gson().toJson(queue), PlayerService.EXTRA_TRACK_LIST); 
context.startService(intent); 

Et pour récupérer cet objet nouveau:

Song song = new Gson().fromJson(intent.getStringExtra(PlayerService.EXTRA_TRACK_LIST), Song.class); 

Ou, si la liste (je crois que vous le cas):

Type listType = new TypeToken<ArrayList<Song.class>>(){}.getType(); 
List<Song> songList = new Gson().fromJson(intent.getStringExtra(PlayerService.EXTRA_TRACK_LIST), listType); 
+0

Il s'agit d'une ArrayList qui vient juste d'être nommée en file d'attente car elle contient de la musique provenant d'une file d'attente de chansons.Je vais essayer votre dernière approche Gson, je crois qu'il y a une erreur dans l'implémentation Parcelable de ma classe Song. – osharifali