【发布时间】:2013-01-23 01:38:45
【问题描述】:
我正在从事一个项目,该项目涉及我必须与构成应用程序的所有活动共享一个对象数组列表。直到最近,我通过实现 parcelable 接口在活动之间传递列表。下面是一个例子:
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 类 - 我将其更改为 Singleton(保存菜单项列表)
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 对数据进行全局访问,我想知道切换到这种数据访问方式是否是个好主意?就代码而言,它似乎更容易控制并且更整洁。
我很想知道您对此有何看法。这里的这个链接是我想要实现的模式:
我应该提一下,这个项目是我课程学习的一部分。我必须在几周内提交我的代码,所以我正在寻找提高效率的最佳方法。因此,如果您也发现任何看起来有问题的地方,请告诉我!
【问题讨论】:
-
我想知道切换到 [a singleton] 是不是一个好主意? => 99.9% 的时间是bad idea。
-
在我看来,这两种解决方案在某种程度上都是有效的。取决于有多少活动正在使用这些数据。此外,如果数据变大,您应该使用另一种解决方案,然后是单例或可解析的,例如D b。关于单例,您应该阅读此code.google.com/p/google-singleton-detector/wiki/…
-
你不是在某个时候保存数据吗?
-
@njzk2 是的,你为什么这么问?
-
因为您可能有某种数据库 ID,您可以传输它而不是对象以减小“状态”的大小
标签: android singleton parcelable application-singleton