这是我的情况。我编写了一个存储上下文的播放列表类。播放列表有9个子类。不幸的是,要在意图之间传递播放列表,它必须实现Serializable。这是一个问题,因为播放列表存储上下文,因此Iterator可以工作,因为必须从Iterator重写的Iterator方法不能接受任何参数。因此,我必须将Context 存储在某处,因为它需要确定播放列表的大小。这是(简化)代码。
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();
}
}
}
我已经读过你可以存储一个静态上下文,但这是一个糟糕的设计。我似乎无法找到解决方法。
我考虑添加一个在writeObject中分配的静态上下文引用,然后在readObject中访问,因为转换应该几乎是即时的,因为Serialization实现只是为了可以在intent中传递播放列表。但即使这样也感觉很难过。
是否有一个共同的工作来处理我们无法序列化上下文的事实?我的解决方案在稳定性方面是否可接受?这可能违反了规则,但在这种情况下你的建议是什么?
答案 0 :(得分:1)
我编写了一个存储上下文的播放列表
这可能不是一个好主意。
不幸的是,要在意图之间传递播放列表,它必须实现Serializable
可能是Parcelable
,但这并不能解决您的问题。 Context
无法进入Serializable
或Parcelable
。
因为播放列表存储了一个上下文,所以Iterator可以工作,
这可能不是一个好主意。
因此,我必须将Context存储在某处,以确定播放列表的大小。
或者,Playlist
可以保持播放列表的大小。 int
可以与Serializable
或Parcelable
一起使用。
或者,摆脱Iterator
,因为它不能与Serializable
或Parcelable
一起使用。
我似乎无法找到解决方法。
让Playlist
成为纯模型对象,没有Context
。
或者,根据用例,Playlist
为单身,使用Application
作为Context
。目前还不清楚是否只有一个Playlist
或几个。
但在这种情况下你的建议是什么?
Playlist
不应该有Context
且不应该有Iterator
。