簡體   English   中英

在Android中將對象引用保存到Bundle

[英]Save object reference to Bundle in Android

是否可以保存對包中對象的引用?
不是整個對象,只是參考?

例如, Bundle類有get對象的方法,但我找不到putset方法。

我需要它,因為在一個活動中,我創建了一個我的計時器類的實例,然后我啟動計時器: myTimer.start()

如果我必須重新啟動活動,我想將計時器恢復為之前的值。

希望你不能這樣做。 您只能在包中存儲基元。 正如Marcin Orlowski提到的“存儲”,通過實現Parcelable接口可以實現整個對象。 通過“存儲”我的意思是存儲對象狀態。 實現此接口可幫助您將對象狀態保存在不同的代碼段中,而無需將其所有屬性一次又一次地置於Bundle對象中。

當活動遲早進入暫停狀態時,您的活動使用的所有對象都將被垃圾收集器刪除,因此存儲對它們的引用將是愚蠢的。

你不能。 你只能通過有限的數據類型,你可以通過看看在文檔列表的方法 ,如果你想比單多的原語那么你的類需要實現Parcelable接口(或使用助手像Parceler )。 完成后,您將能夠通過Bundle傳遞對象數據(但仍然不是對象本身)

官方文檔建議在“配置更改”期間使用片段存儲引用(不,我認為這並不意味着您需要將您的活動作為片段放置,而是使用片段作為存儲介質(需要說明)):

http://developer.android.com/guide/topics/resources/runtime-changes.html#RetainingAnObject

在配置更改期間保留對象

如果重新啟動活動需要恢復大量數據,重新建立網絡連接或執行其他密集操作,則由於配置更改而導致的完全重新啟動可能會降低用戶體驗。 此外, 您可能無法使用系統為onSaveInstanceState()回調為您保存的Bundle完全恢復活動狀態 - 它不是為承載大型對象 (如位圖)而設計的,其中的數據必須序列化然后反序列化,這會消耗大量內存並使配置變化緩慢。 在這種情況下,您可以通過在配置更改時重新啟動活動時保留Fragment來減輕重新初始化活動的負擔。 此片段可以包含對要保留的有狀態對象的引用。

當Android系統因配置更改而關閉您的活動時,您標記為要保留的活動片段不會被銷毀。 您可以將此類片段添加到活動中以保留有狀態對象。

在運行時配置更改期間保留片段中的有狀態對象:

擴展Fragment類並聲明對有狀態對象的引用。 創建片段時調用setRetainInstance(boolean)。 將片段添加到您的活動中。 重新啟動活動時,使用FragmentManager檢索片段。 例如,按如下方式定義片段:

public class RetainedFragment extends Fragment {

    // data object we want to retain
    private MyDataObject data;

    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain this fragment
        setRetainInstance(true);
    }

    public void setData(MyDataObject data) {
        this.data = data;
    }

    public MyDataObject getData() {
        return data;
    }
}

警告:雖然您可以存儲任何對象,但您永遠不應傳遞與Activity關聯的對象,例如Drawable,Adapter,View或與Context關聯的任何其他對象。 如果這樣做,它將泄漏原始活動實例的所有視圖和資源。 (資源泄漏意味着您的應用程序保持對它們的保持並且它們不能被垃圾收集,因此可能會丟失大量內存。)

另一種方法是將POJO轉換為json,然后將GSON庫串起來並以字符串形式保存在bundle中。 然后從bundle中將其作為字符串檢索回來,並使用相同的GSON庫將其轉換回對象。 示例代碼如下。

將JSON轉換為String並將其保存在bundle中

JsonElement json = new JsonElement();
String result = gson.toJson(json);
bunlde.putString("key",result);

再次將String從bundle轉換為object

 JsonElement json = gson.fromJson(bundle.getString("key"), JsonElement.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM