7

我已經爲此擱置了一段時間了。 我正在研究一款存儲人魚捕獲量,最喜歡釣魚位置,解決方案庫存量和其他數據的Android應用程序。我所有的類都是可串行化的,並且可以在迄今爲止似乎能夠工作的活動之間保存和加載。但我預測隨着越來越多的數據被存儲,應用程序將開始運行緩慢。在Android活動之間高效地傳遞自定義對象數據[Mono Android]

我基本上要問的是,有什麼方法可以在整個應用程序中保留這些數據,所以我不必在每次彈出新的屏幕時都加載它。我已經找到了以下信息來幫助,但它需要一個更加清楚一點,我明白了:

另一個論壇上說,你可以在應用程序對象東東吧:

[Application] 
public class MyApp : Android.App.Application { 
    public MyApp(IntPtr handle) 
     : base (handle) 
    { 
    } 

    public FishingData Data {get; set;} 
} 

內然後你活動時間:

((MyApp) this.ApplicationContext).Data = value; 

所以我從來沒有真正聽說過這樣的做法的,我不知道這會度過整個應用程序(我覺得無論哪種方式,它會必須通過加載數據序列化。這是我想要的應用程序待辦事項:

的第一項活動是主菜單,當屏幕負載下必須做到:

  1. 如果找到一個設置文件,使用序列加載以前FishingData對象(我知道如何做到這一點)
  2. 如果沒有,然後創建一個新的清潔FishingData對象後保存(我知道這也是)
  3. 所以,現在我們有一個FishingData對象,我怎麼保證我不必重複步驟1 -2在每個活動中。我怎樣才能以某種方式將FishingData對象傳遞給下一個活動,並確保它在應用程序仍然存在的同時生活。 我只想加載一次(通過序列化)(< - 不知道如何做到這一點),並保存它只有當用戶添加數據到這個對象(我知道該怎麼做)。

任何幫助將不勝感激。這聽起來似乎弄不清楚。這似乎是一件很平常的事情,但我一直沒有找到任何詳細的信息。

+0

我不知道,但+1格式非常好的第一個問題。歡迎來到StackOverflow。 –

+0

要在活動之間傳遞信息,您希望使用Parcelable http://developer.android.com/reference/android/os/Parcelable.html但是,要保存所有這些數據,最好至少創建一個sqllite數據庫,或者更理想地使用自己的數據庫 – Jameo

+0

查看http://forums.xamarin.com/discussion/451/communicate-with-iserializable – Cheesebaron

回答

1

您可以使用此方法,將生活,只要你Application對象是活的(這意味着它活在你的整個應用程序和活動)。您可以閱讀關於使用存儲在Application對象here中的全局變量的更多信息。我不認爲單聲道會有所作爲,這將阻止你使用這種方法。

+0

謝謝,我用上述鏈接的步驟對它進行了測試,現在它成功保留了一個全局變量存儲在整個活動。感謝您的幫助,這是我肩上的一個重量。 – TeamChillshot

+0

很高興幫助:)請將問題標記爲已解決:http://stackoverflow.com/faq#howtoask – Jong

+1

應用程序對象保證會在所有活動之前創建並保留,直到所有活動都被銷燬。 儘管由於Android會在應用程序處於後臺時可以銷燬所有活動和應用程序對象,因此無法將其用於全局狀態。 –

3

這是我如何通過parcelable將應用程序傳遞給應用程序。比方說你有一個名爲漁夫類(基本用戶)

public class Fisherman implements Parcelable { 
private String name; 
private Tacklebox box; 
public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeString(name); 
    out.writeParcelable(box, 0); 
} 

public static final Parcelable.Creator<Fisherman> CREATOR 
     = new Parcelable.Creator<Fisherman>() { 
    public Fisherman createFromParcel(Parcel in) { 
     return new Fisherman(in); 
    } 

    public Fisherman[] newArray(int size) { 
     return new Fisherman[size]; 
    } 
}; 

private Fisherman(Parcel in) { 
    name = in.readString(); 
    box = in.readParcelable(com.fisher.Tacklebox); 
} 
} 

在這個例子中,您爲您的每個數據模型parcelable。所以說你有一個漁夫對象,它包含另一個叫做tacklebox的對象。如果您繼續嵌套模型,您還將爲tacklebox定義這一點,等等。這樣,所有你需要做的傳遞活動之間的數據是

Intent intent = new Intent(this, Activity.class); 
intent.putParcelableExtra("com.fisher.Fisherman", fisherman); 

和閱讀

Bundle b = getIntent().getExtras(); 
Fisherman fisher = b.getParcelable("com.fisher.Fisherman"); 

這偏偏回答你的問題的唯一步驟3,但我建議打破你的3個步驟,每一個進入自己的問題,因爲你試圖做的是比一個問題稍長一點