【问题标题】:Android Context not serializable dilemma for class that implements Iteratable实现Iterable的类的Android Context不可序列化困境
【发布时间】:2016-05-14 20:34:31
【问题描述】:

这是我的情况。我编写了一个存储上下文的播放列表类。播放列表有 9 个子类。不幸的是,要在 Intent 之间传递 Playlist,它必须实现 Serializable。这是一个问题,因为 Playlist 存储了一个上下文,因此 Iterator 可以工作,因为必须从 Iterator 重写的 Iterator 方法不能接受任何参数。因此,我必须将上下文存储在 somewhere 中,因为它需要确定播放列表的大小。这是(简化的)代码。

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 中访问,因为转换应该几乎是即时的,因为序列化实现只是为了让播放列表可以在意图中传递。但即使这样也感觉很老套。

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

【问题讨论】:

  • 尝试将逻辑与数据分离。然后您可以发送数据而不会遇到您遇到的问题。

标签: java android serialization


【解决方案1】:

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

这可能不是一个好主意。

不幸的是,要在 Intent 之间传递 Playlist,它必须实现 Serializable

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

因为 Playlist 存储了一个上下文,这样 Iterator 才能工作,

这可能不是一个好主意。

因此,我必须将 Context 存储在某个地方,因为它需要确定播放列表的大小。

或者,Playlist 可以容纳播放列表的大小。 int 很容易与SerializableParcelable 一起使用。

或者,去掉Iterator,因为这也不适用于SerializableParcelable

我似乎找不到解决办法。

Playlist 是纯模型对象,没有Context

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

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

Playlist 不应包含Context,也不应包含Iterator

【讨论】:

  • 不幸的是,在构造函数中无法确定播放列表的大小。从游标大小读取,需要时才生成。
猜你喜欢
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2012-02-17
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多