在活动之间传递继承抽象类的对象

4
我正在尝试通过制作一个辅助程序来学习Android开发,以帮助我玩的棋盘游戏。我遇到了与传递自定义对象之间的活动中回答的情况非常相似的情况。我的情况与此不同的是,涉及的自定义对象都扩展了一个抽象类。
抽象类表示芯片(在游戏中类似于卡片),如下所示:
import java.util.ArrayList;

public abstract class Chip{
    protected String name;
    protected int imageID;
    protected ArrayList<String> chipColors;
    protected ArrayList<String> chipTypes;

    public String toString(){
        return name;    
    }

    //Getters
    public String getName(){ return name; }
    public int getImageID() { return imageID; }
    public String getSet() { return set; }
    //Figure out how I need to deal with colors/types when I get there
}

一个扩展Chip的类的示例:
public class ChipA extends Chip{
    public ChipA (){
        super();
        name = "Chip A";
        imageID = R.drawable.chipa;
        set = "Basic";
        chipTypes = new ArrayList<String>();
        chipTypes.add("typeA");
        chipColors = new ArrayList<String>();
        chipColors.add("red");
        chipColors.add("green");
    }
}

我选择这种方法是为了只需在需要时调用new ChipA()即可创建适当类型的新芯片,而不是使用new Chip(<长列表的描述Chip A的参数>)。我需要从一个活动传递这些芯片的集合到另一个活动中。我已经通过在全局存储要传递的芯片来解决了我的代码中的这个问题,就像这篇文章中描述的那样,但是该文章建议改用意图附加项执行此类操作。有人能更清楚地解释原因吗?这只是约定吗?如果这只是可读性的问题,这种方法似乎相对紧凑和易读。

从阅读周围的内容,很明显,使用Intent extras在活动之间传递任意类的预期方式是让它们实现Parcelable。然而,由于我正在处理许多与所涉类的子类,这意味着必须向每个子类添加writeToParcelParcelable.Creator。(describeContents()似乎不重要,据我所知,我可以将其实现在基本抽象类中。)我可能在这里有很多子类,这意味着需要添加大量重复的代码。在这种情况下,实现Parcelable仍然被认为是首选方法吗?我是否缺少一些东西可以帮助我减少冗余代码?如果有可能,我希望保持我的芯片子类相对紧凑。

请温柔点,我对Stack Overflow和Android开发都很陌生。

1个回答

2
您没有遗漏任何内容,Parcelable 是处理这种情况的首选方式。我同意它会导致一些样板代码,但这是处理此类情况的清晰方式。
通过扩展 Application 类可以跳过这个步骤,但会导致一些复杂性:在某些情况下,Application 对象可能会被删除,这将导致非常麻烦的错误。最好按照预期的方式处理此问题,并为要移动的每个对象创建构造函数(Parcel)。
另一个问题是 Singleton 模式本身越来越受到批评。我不会详细介绍,这些讨论已经涵盖了这个话题:
https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
What is so bad about singletons? 更糟糕的是,在Android中,你甚至不能指望一个真正的Singleton;你没有任何保证,你正在操作的Application对象(或者你自己创建的Singleton)将通过应用程序的生命周期保留其状态。(随机引用:http://portabledroid.wordpress.com/2012/05/04/singletons-in-android/
所以,请不要使用Singleton来避免编写几个Parcels。这将在以后回来咬你一口。
编辑:这里有一个很好的解释,如何重现可怕的Application类崩溃:http://www.developerphil.com/dont-store-data-in-the-application-object/

你能否举出一些可能导致应用程序被删除的例子,或者链接到一篇更详细的文章?我原本想使用Application类来保存选项菜单中的信息;这似乎是自然的方法。如果它真的那么不可靠,我将不得不修改我的选项菜单计划。 - Proven Paradox
抱歉,我没有链接,这只是我的经验和思考的结果。我猜测Application对象被销毁的主要原因是内存不足。为了解决这个问题,你需要实现Parcelable来保存/恢复你的Application状态...在第一次实现它时,可以节省一些时间。 - Teovald
我会相信你的话并重构我的代码以使用Parcelable。但是我仍然希望在某个时候听到更具体的原因。感谢您的时间。 - Proven Paradox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接