2013-04-18 184 views
4

我正在尝试通过制作辅助程序来玩我玩的棋盘游戏来学习Android开发。我遇到了与在Pass custom object between activities中回答的情况非常相似的情况。我的情况的不同之处在于所讨论的自定义对象都是扩展抽象类的。传递对象在活动之间延伸抽象类

抽象类表示一个芯片(相当于一个卡游戏明智),并且如下:

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 
} 

一类,将延伸芯片的一例:

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"); 
    } 
} 

I” m采取这种方法,以便我可以创建适当类型的新芯片,只需拨打new ChipA()我需要的地方,而不是new Chip(<long list of arguments that describe Chip A>)。我需要将这些芯片的集合从一个活动传递到另一个活动。我已经在我的代码中解决了这个问题,通过存储我想要在全球范围内传递的芯片,如this article中所述,但文章的结尾建议使用意向附加代替这种操作。有人能更清楚地解释为什么吗?这只是惯例吗?如果仅仅是可读性的问题,这种方法看起来相对紧凑和可读。

从阅读中可以明显看出,使用Intent extras在活动之间传递任意类的预期方式是让它们实现Parcelable。但是,由于我正在处理有关课程的许多子类,这意味着要为每个子类添加writeToParcelParcelable.Creator。 (describeContents()似乎并不重要,据我了解,我可以在基本的抽象类中实现它。)我可能会在这里有很多子类,这意味着要添加大量的重复代码。在这种情况下,执行Parcelable仍然被认为是首选方法?我是否错过了能够减少冗余代码的东西?如果可能,我宁愿保持我的Chip子类非常紧凑。

请温柔一点,我是堆栈溢出和Android开发的新手。

回答

2

您不会错过任何东西,Parcelable是执行此操作的首选方式。
我同意它导致一些样板代码,但这是处理这个问题的简单方法。

可以通过扩展Application类来跳过这一点,但这会导致一些复杂性:在某些情况下可以删除Application对象,并且这会导致非常麻烦的错误。只需按照预期的方式处理这个方法并为每个以这种方式移动的对象创建构造函数(包)即可。另一点是Singleton模式本身越来越受到批评。我不会详谈,这些讨论涵盖话题:
https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
What is so bad about singletons?

更糟的是,在Android中,你甚至不能在一个真正的辛格尔顿计数;您没有任何保证您正在操作的应用程序对象(或您自己创建的单例)将在应用程序的生命周期中保持其状态。 (随机编号:http://portabledroid.wordpress.com/2012/05/04/singletons-in-android/

所以请不要使用Singleton作为避免编写几个Parcels的方法。它会在以后回来并咬你。

编辑:这里是如何重现可怕的应用程序类崩溃了很好的解释:要删除http://www.developerphil.com/dont-store-data-in-the-application-object/

+0

可不可以给的东西,可能会导致应用一些例子或连结更多描述的文章?我实际上已经考虑使用Application类来保存选项菜单中的信息;这似乎是自然而然的做法。如果真的那么不可靠,我将不得不改变我对选项菜单的计划。 –

+0

对不起,没有链接,我只是通过经验来了解这一点,因为我不得不考虑如何处理这种模式。我想应用程序对象被破坏的主要原因是简单的内存不足。要解决这个问题,您必须实现Parcelable来保存/恢复您的应用程序状态。只需在第一时间实施它就可以为您节省一些时间。 – Teovald

+0

我会为你付出代价,然后重构我的代码,然后使用Parcelable。我仍然希望在某个时候听到更具体的理由。谢谢你的时间。 –