我试图通过为我玩的棋盘游戏制作帮助程序来学习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
}
扩展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(<long list of arguments that describe Chip A>)
。我需要将这些芯片的集合从一个活动传递到另一个活动。我已经在我的代码中通过存储我想要传递的Chips来解决这个问题,如this article中所述,但文章的结尾建议使用intent extras来代替这种操作。有人可以更清楚地解释原因吗?这只是惯例吗?如果只是一个可读性问题,这种方法似乎相对紧凑和可读。
从阅读中可以清楚地看出,使用Intent附加功能在活动之间传递任意类的预期方法是让它们实现Parcelable
。但是,由于我正在使用该类的许多子类,这意味着向每个子类添加writeToParcel
和Parcelable.Creator
。 (describeContents()
似乎并不重要,据我所知,我可以在基本的抽象类中实现它。)我可能会在这里有很多子类,这意味着添加了大量的重复代码。在这种情况下,实施Parcelable
仍被视为首选方法吗?我错过了一些可以减少冗余代码的东西吗?如果可能的话,我宁愿保持我的芯片子类相当紧凑。
请保持温和,我是Stack Overflow和Android开发的新手。
答案 0 :(得分:2)
你没有遗漏任何东西,Parcelable是这样做的首选方式 我同意它会导致一些样板代码,但这是处理这个问题的干净方法。
可以通过扩展Application类来跳过这一步但是会导致一些复杂的问题:在某些情况下可以删除Application对象,这会导致非常麻烦的错误。以预期的方式处理此方法更容易,并为您正在移动的每个对象创建构造函数(Parcel)。
另一点是,单身人士模式本身受到越来越多的批评。我不会详细介绍,这些讨论涵盖了这个主题:
https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
What is so bad about singletons?
更糟糕的是,在Android中,你甚至不能指望真正的单身人士;您没有任何保险,您正在操作的应用程序对象(或您自己创建的Singleton)将在应用程序的生命周期内保持其状态。 (随机参考:http://portabledroid.wordpress.com/2012/05/04/singletons-in-android/)
所以请不要使用Singleton作为避免编写几个Parcel的方法。它会在以后再回来咬你。
编辑:这里有一个很好的解释如何重现可怕的Application类崩溃:http://www.developerphil.com/dont-store-data-in-the-application-object/