2013-01-22 24 views
0

我正在開發一個項目,涉及到我必須與構成應用程序的所有活動共享對象的數組列表。直到最近,我還是通過實現parcelable接口來在活動之間傳遞列表。這方面的一個例子如下所示:Parcelable或Singleton?

MenuItem類:

ublic class MenuItem implements Parcelable { 

private String name; 
private double price; 
private int qty; 
private String info; 

public MenuItem(String name, double price) { 
    super(); 
    this.name = name; 
    this.price = price; 
} 
public MenuItem() { 
    // TODO Auto-generated constructor stub 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public double getPrice() { 
    return price; 
} 
public void setPrice(double price) { 
    this.price = price; 
} 

public int getQty() { 
    return qty; 
} 
public void setQty(int qty) { 
    this.qty = qty; 
} 
public String getInfo() { 
    return info; 
} 
public void setInfo(String info) { 
    this.info = info; 
} 
@Override 
public String toString() { 
    return name; 
} 


//Parcelable methods. 
public static final Parcelable.Creator<MenuItem> CREATOR = new Parcelable.Creator<MenuItem>() { 

    @Override 
    public MenuItem createFromParcel(Parcel source) { 
     return new MenuItem(source); 
    } 

    @Override 
    public MenuItem[] newArray(int size) { 
     return new MenuItem[size]; 
    } 
}; 

public MenuItem(Parcel source) { 
    this(); 
    readFromParcel(source); 
} 

private void readFromParcel(Parcel source) { 
    name = source.readString(); 
    price = source.readDouble(); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(name); 
    dest.writeDouble(price); 
} 

}

Order類 - 我會改變是辛格爾頓(持有的菜單項列表)

public class Order implements Parcelable { 


private int covers; 
private int table; 
private ArrayList<MenuItem> items; 


public Order(){ 
    super(); 
    this.items = new ArrayList<MenuItem>(); 

} 

public static final Parcelable.Creator<Order> CREATOR = new Parcelable.Creator<Order>() { 

    @Override 
    public Order createFromParcel(Parcel source) { 
     return new Order(source); 
    } 

    @Override 
    public Order[] newArray(int size) { 
     return new Order[size]; 
    } 


}; 

public Order(int covers, int table) { 
    super(); 
    this.covers = covers; 
    this.table = table; 
    this.items = new ArrayList<MenuItem>(); 
} 

public int getCovers() { 
    return covers; 
} 

public void setCovers(int covers) { 
    this.covers = covers; 
} 

public int getTable() { 
    return table; 
} 

public void setTable(int table) { 
    this.table = table; 
} 

public ArrayList<MenuItem> getItems() { 
    return items; 
} 

public void setItems(ArrayList<MenuItem> items) { 
    this.items = items; 
} 

//add to order 
public void addToOrder(MenuItem m){ 
    items.add(m); 
} 

//remove from order 
public void removeFromOrder(MenuItem m){ 
    items.remove(m); 
} 

public Order(Parcel source) { 
    this(); 
    readFromParcel(source); 
} 

@Override 
public int describeContents() { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    // TODO Auto-generated method stub 
    dest.writeInt(covers); 
    dest.writeInt(table); 
    dest.writeTypedList(items); 

} 

private void readFromParcel(Parcel source) { 
    // TODO Auto-generated method stub 
    covers = source.readInt(); 
    table = source.readInt(); 
    items = new ArrayList<MenuItem>(); 
    source.readTypedList(items, MenuItem.CREATOR); 

} 

}

這就是我如何通過活動之間的數據:

myOrderBtn.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(v.getContext(), "myOrderBtn", Toast.LENGTH_SHORT).show(); 
      Intent i = new Intent(v.getContext(), ViewOrderActivity.class); 
      i.putExtra("data", order); 
      if(!saved){ 
      saveOrderState(); 
      } 
      startActivity(i); 

     } 
    }); 

和檢索這樣:

public void getOrderData(){ 
    Intent i = getIntent(); 
    if(i != null && i.hasExtra("data")){ 
     order = i.getParcelableExtra("data"); 
     Toast.makeText(this.getApplicationContext(), "STARTERS recieved order object, covers: " + order.getCovers() + " table no: " + order.getTable() + " order size: " + order.getItems().size(), Toast.LENGTH_SHORT).show(); 

     if(order.getItems().size() == 0){ 
      //Toast.makeText(this.getApplicationContext(), "No items added to your order...", Toast.LENGTH_SHORT).show(); 
     }else{ 
      for(int j = 0; j != order.getItems().size(); j++){ 
       dishItems.add(order.getItems().get(j)); 
      } 
     } 

     saved = false; 

    } 
} 

今天,我瞭解了利用一個Singleton的對數據進行全球訪問,我想知道這將是一個好主意,切換到這種風格的數據訪問?對代碼的尊重似乎更容易控制並且更加整齊。

我很想看看你對此的看法。這裏這個環節我想實現的模式:

http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/

我應該提到,該項目是我在我的課程研究的一部分。我必須在幾周內提交我的代碼,所以我正在尋找使它更高效的最佳方式。所以請讓我知道,如果你看到任何看起來不對的東西!

+1

*我想知道這將是一個好主意,切換到[單身] * => 99.9%的時間,這是[壞主意](http://stackoverflow.com/questions/1448393/singleton-design-pattern-pitfalls)。 – assylias

+0

在我看來,這兩種解決方案在一定程度上都是有效的。取決於使用此數據的活動數量。同樣,如果數據變大,你應該使用另一種解決方案,然後單例或可接受例如D b。關於單身你應該閱讀這個http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial – Tobrun

+1

是不是你在某個時候保存你的數據? – njzk2

回答

0

使用Parcelable在單個Linux進程中移動對象幾乎沒有什麼理由。我建議讓您的菜單的自定義應用程序對象的靜態成員,這樣的事情:

public class MyApplication extends Application { 
    private static final List<MenuItem> menu; 
    static { 
     List<MenuItem> l = new ArrayList<MenuItems>(); 
     l.add(new MenuItem(...)); 
     ... 
     menu = Collections.unmodifiableList(l); 
    } 

    ... 

    public List<MenuItems> getMenu() { return menu; } 

    .... 

} 

確保列表是不變的,所以你不必擔心併發問題。

在您的清單:

<application 
    android:name=".MyApplication" 

...和訪問它?

List<MenuItem> menu = ((MyApplication) getApplication()).getMenu(); 
+0

中保留「// TODO自動生成方法存根」謝謝你的回答,我會對我的代碼進行必要的修改。 – Javacadabra