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
}

将扩展 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>). 我需要将这些筹码的集合从一个活动传递到另一个活动。我已经在我的代码中解决了这个问题,方法是存储我想要在本文中描述的全局传递的芯片,但是文章的结尾建议使用 Intent Extras 来代替这种操作。有人可以更清楚地解释为什么吗?这只是约定吗?如果只是可读性的问题,这个方法看起来比较简洁易读。

通过阅读,很明显,使用 Intent extras 在活动之间传递任意类的预期方法是让它们实现Parcelable。但是,由于我正在处理相关类的许多子类,这意味着将 awriteToParcel和 a添加Parcelable.Creator到每个子类。(describeContents()看起来并不重要,据我所知,我可以在基本抽象类中实现它。)我可能会在这里有很多子类,这意味着添加大量重复代码。在这种情况下,实施是否Parcelable仍被视为首选方法?我是否遗漏了一些可以让我减少冗余代码的东西?如果可能的话,我宁愿保持我的 Chip 子类相当紧凑。

请温柔一点,我是 Stack Overflow 和 Android 开发的新手。

4

1 回答 1

2

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

可以通过扩展 Application 类来跳过这一点,但它会导致一些复杂性:在某些情况下可以删除 Application 对象,这会导致非常麻烦的错误。以预期的方式处理此问题并为您以这种方式移动的每个对象创建构造函数(包裹)会更容易。

还有一点就是,Singleton 模式本身越来越受到诟病。我不会详细介绍,这些讨论涵盖了该主题:
https :
//softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what 单身人士有什么不好?

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

所以请不要使用 Singleton 来避免编写几个 Parcel。它稍后会回来咬你。

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

于 2013-04-18T11:04:31.920 回答