Java 实现可迭代的类的Android上下文不可序列化困境
这是我的情况。我编写了一个Playlist类来存储上下文。Playlist有9个子类。不幸的是,要在意图之间传递播放列表,它必须实现可序列化。这是一个问题,因为Playlist存储上下文,因此迭代器可以工作,因为必须从迭代器重写的迭代器方法不能接受任何参数。因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小。这是(简化的)代码Java 实现可迭代的类的Android上下文不可序列化困境,java,android,serialization,Java,Android,Serialization,这是我的情况。我编写了一个Playlist类来存储上下文。Playlist有9个子类。不幸的是,要在意图之间传递播放列表,它必须实现可序列化。这是一个问题,因为Playlist存储上下文,因此迭代器可以工作,因为必须从迭代器重写的迭代器方法不能接受任何参数。因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小。这是(简化的)代码 public抽象类Playlist实现可序列化、可编辑 { 私有静态最终长serialVersionUID=0L; 私人语境; 公共上下文getConte
public抽象类Playlist实现可序列化、可编辑
{
私有静态最终长serialVersionUID=0L;
私人语境;
公共上下文getContext(){return Context;}
公共播放列表(上下文)
{
this.context=上下文;
}
public abstract int size();//在所有当前编写的子级中引用了getContext()
公共抽象歌曲getSong(int索引);//在所有当前编写的子级中引用getContext()
@凌驾
公共播放迭代器迭代器()
{
返回新的播放列表迭代器();
}
公共类迭代器实现迭代器
{
私有电流;
播放迭代器()
{
电流=0;
}
@凌驾
公共布尔hasNext()
{
return current
我已经读到,您可以存储静态上下文,但这是糟糕的设计。我似乎找不到解决这个问题的办法
我考虑过添加一个静态上下文引用,该引用在writeObject中分配,然后在readObject中访问,因为转换应该几乎是即时的,因为序列化实现只是为了能够在意图中传递播放列表。但即使这样也感觉不舒服
对于无法序列化上下文这一事实,是否有共同的解决办法?我的解决方案在稳定性方面可以接受吗?这可能违反规定,但在这种情况下,你有什么建议
我已经编写了一个播放列表类来存储上下文
那可能不是个好主意
不幸的是,要在意图之间传递播放列表,它必须实现可序列化
它可能是可包裹的,但这并不能解决您的问题。上下文
不能进入可序列化
或可打包
因为Playlist存储上下文,所以迭代器可以工作
那可能不是个好主意
因此,我必须将上下文存储在某个位置,因为需要它来确定播放列表的大小
或者,播放列表
可以容纳播放列表的大小。int
很容易与可序列化
或可打包
一起使用
或者,去掉迭代器
,因为这对Serializable
或Parcelable
都不起作用
我似乎找不到解决这个问题的办法
将播放列表
设置为纯模型对象,不包含上下文
或者,根据使用情况,使用应用程序作为上下文,将播放列表
设置为单例。目前尚不清楚播放列表是只有一个还是几个
但在这种情况下,你的建议是什么
播放列表
不应包含上下文
,也不应包含迭代器
尝试将逻辑与数据分开。然后,您可以发送数据而不出现问题。不幸的是,无法在构造函数中确定播放列表的大小。它是从光标大小读取的,直到需要时才生成。
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();
}
}
}