【问题标题】: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 不能进入 Serializable 或 Parcelable。

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

这可能不是一个好主意。

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

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

或者,去掉Iterator,因为这也不适用于Serializable 或Parcelable。

我似乎找不到解决办法。

让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
相关资源
最近更新 更多