2016-05-14 5 views
1

Hier ist meine Situation. Ich habe eine Playlist-Klasse geschrieben, die einen Kontext speichert. Playlist hat 9 Kinderklassen. Um die Playlist zwischen Intents zu übergeben, muss sie leider Serializable implementieren. Dies ist ein Problem, da die Wiedergabeliste einen Kontext speichert, so dass der Iterator funktionieren kann, da die Iterator-Methode, die von Iterator überschrieben werden muss, keine Parameter akzeptieren kann. Daher muss ich den Kontext irgendwo speichern, wie es benötigt wird, um die Größe der Playlist zu bestimmen. Hier ist der (vereinfachte) Code.Android Context nicht serialisierbar Dilemma für Klasse, die Iteratable implementiert

public abstract class Playlist implements Serializable, Iterable<Song> 
    { 
     private static final long serialVersionUID = 0L; 

     private Context context; 
     public Context getContext() { return context; } 

     public Playlist(Context context) 
     { 
      this.context = context; 
     } 

     public abstract int size(); //getContext() referenced in all currently written children 
     public abstract Song getSong(int index); //getContext() referenced in all currently written children 

     @Override 
     public PlaylistIterator iterator() 
     { 
      return new PlaylistIterator(); 
     } 

     public class PlaylistIterator implements Iterator<Song> 
     { 
      private int current; 

      PlaylistIterator() 
      { 
       current = 0; 
      } 

      @Override 
      public boolean hasNext() 
      { 
       return current < size(); //SIZE HERE needs access to a context, but this method certainly can not take one, and neither can the constructor above.** 
      } 

      @Override 
      public Song next() 
      { 
       if (!hasNext()) 
        throw new NoSuchElementException(); 

       return getSong(current++); 
      } 

      @Override 
      public void remove() 
      { 
       throw new UnsupportedOperationException(); 
      } 
     } 
    } 

Ich habe, dass Sie einen statischen Kontext kann Speicher lesen, aber, dass diese schlechte Design. Ich kann anscheinend keinen Weg finden.

Ich habe überlegt, eine statische Kontextreferenz hinzuzufügen, die in writeObject zugewiesen ist, und dann in readObject zugegriffen wird, da der Übergang fast augenblicklich sein sollte, da die Serialisierungsimplementierung nur so ist, dass Playlist in einer Absicht übergeben werden kann. Aber selbst das fühlt sich hacky an.

Gibt es eine gemeinsame Arbeit mit der Tatsache, dass wir den Kontext nicht serialisieren können? Ist meine Lösung in Bezug auf Stabilität akzeptabel? Es könnte gegen die Regeln verstoßen, aber was ist Ihre Empfehlung in dieser Situation?

+0

Versuchen Sie, die Logik von den Daten zu trennen. Dann könnten Sie einfach die Daten ohne das Problem senden, das Sie haben. – tynn

Antwort

1

Ich habe eine Playlist-Klasse geschrieben, die einen Kontext

Das ist wahrscheinlich keine gute Idee, speichert.

Leider Play zwischen Absichten zu bestehen, muss es Serializable

implementieren Es Parcelable sein könnte, aber das ist Ihr Problem nicht lösen. Eine Context kann weder in eine Serializable noch eine Parcelable gehen.

weil Playlist einen Kontext speichert, so dass der Iterator arbeiten,

Das ist wahrscheinlich keine gute Idee.

Daher muss ich Kontext irgendwo speichern, wie es benötigt wird, um die Größe der Playlist zu bestimmen.

Oder die Playlist könnte die Größe der Wiedergabeliste halten. Ein int kann ohne weiteres mit Serializable oder Parcelable verwendet werden.

Oder, loswerden der Iterator, wie das wird nicht gut mit Serializable oder Parcelable entweder funktionieren.

Ich kann nicht scheinen, einen Weg um diese zu finden.

Haben Sie Playlist ein reines Modellobjekt, ohne Context.

Oder, je nach Anwendungsfall, Playlist ein Singleton sein, wobei Application als Context verwendet wird. Es ist unklar, ob es nur eine Playlist oder mehrere gibt.

aber was ist Ihre Empfehlung in dieser Situation?

Playlist sollte kein Context halten und sollten keine Iterator haben.

+0

Leider kann die Playlist-Größe im Konstruktor nicht bestimmt werden. Es wird aus der Größe des Cursors gelesen und erst generiert, wenn es benötigt wird. –

Verwandte Themen