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?
Versuchen Sie, die Logik von den Daten zu trennen. Dann könnten Sie einfach die Daten ohne das Problem senden, das Sie haben. – tynn