2013-04-18 241 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。我仍然希望在某個時候聽到更具體的理由。謝謝你的時間。 –