对于实现Iteratable的类,Android Context不是可序列化的困境

时间:2016-05-14 20:34:31

标签: java android serialization

这是我的情况。我编写了一个存储上下文的播放列表类。播放列表有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中传递播放列表。但即使这样也感觉很难过。

是否有一个共同的工作来处理我们无法序列化上下文的事实?我的解决方案在稳定性方面是否可接受?这可能违反了规则,但在这种情况下你的建议是什么?

1 个答案:

答案 0 :(得分:1)

  

我编写了一个存储上下文的播放列表

这可能不是一个好主意。

  

不幸的是,要在意图之间传递播放列表,它必须实现Serializable

可能是Parcelable,但这并不能解决您的问题。 Context无法进入SerializableParcelable

  

因为播放列表存储了一个上下文,所以Iterator可以工作,

这可能不是一个好主意。

  

因此,我必须将Context存储在某处,以确定播放列表的大小。

或者,Playlist可以保持播放列表的大小。 int可以与SerializableParcelable一起使用。

或者,摆脱Iterator,因为它不能与SerializableParcelable一起使用。

  

我似乎无法找到解决方法。

Playlist成为纯模型对象,没有Context

或者,根据用例,Playlist为单身,使用Application作为Context。目前还不清楚是否只有一个Playlist或几个。

  

但在这种情况下你的建议是什么?

Playlist不应该有Context且不应该有Iterator