在Android中将对象引用保存到Bundle

时间:2014-05-15 15:59:05

标签: java android

是否可以保存对捆绑中对象的引用?
不是整个对象,只是参考?

例如,Bundle类具有get对象的方法,但我无法找到putset方法。

我需要它,因为在一个活动中,我创建了一个我的计时器类的实例,然后我启动了计时器:myTimer.start()

如果我必须重新启动活动,我想将计时器恢复为之前的值。

4 个答案:

答案 0 :(得分:5)

希望你不能这样做。您只能在包中存储基元。正如Marcin Orlowski提到的“存储”,整个对象可以通过实现Parcelable接口来实现。通过“存储”我的意思是存储对象状态。实现此接口可帮助您将对象状态保存在不同的代码段中,而不会一遍又一遍地将所有属性都放到Bundle对象中。

当活动迟早进入暂停状态时,您的活动使用的所有对象都将被垃圾收集器删除,因此存储对它们的引用将是愚蠢的。

答案 1 :(得分:2)

你做不到。您只能传递有限的数据类型集,如looking at method lists in the docs所示,如果您需要的不仅仅是单个基元,那么您的类需要实现Parcelable接口(或使用类似Parceler的帮助器) 。完成后,您将能够通过Bundle传递对象数据(但仍然不是对象本身)

答案 2 :(得分:2)

官方文档建议在“配置更改”期间使用片段存储引用(不,我认为这并不意味着您需要将您的活动作为片段放置,而是使用片段作为存储介质(需要说明) ):

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

  

在配置更改期间保留对象

     

如果重新启动活动需要恢复大量数据,请重新建立   网络连接,或执行其他密集操作,然后一个完整的   由于配置更改而重新启动可能会导致用户体验变慢。   此外,您可能无法完全恢复您的   具有Bundle的活动状态,系统为您保存   onSaveInstanceState()回调 - 它不是为了携带大而设计的   对象(如位图)及其中的数据必须序列化   然后反序列化,这可以消耗大量的内存并使其成为   配置变化缓慢。在这种情况下,你可以缓解   通过在何时保留片段来重新初始化您的活动的负担   由于配置更改,您的活动将重新启动。这个   片段可以包含对您想要的有状态对象的引用   保留

     

当Android系统因为a而关闭您的活动时   配置更改,您拥有的活动片段   标记为保留不被销毁。您可以将此类片段添加到您的   用于保存有状态对象的活动。

     

在运行时期间保留片段中的有状态对象   配置更改:

     

扩展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,a   查看或与上下文关联的任何其他对象。如果你这样做,   它会泄漏原始活动的所有视图和资源   实例。 (资源泄漏意味着您的应用程序维护一个   抓住他们,他们不能被垃圾收集,所以记忆力很大   可能会丢失。)

答案 3 :(得分:1)

另一种方法是将POJO转换为json,然后将GSON库串起来并以字符串形式保存在bundle中。然后从bundle中将其作为字符串检索回来,并使用相同的GSON库将其转换回对象。下面的示例代码。

将JSON转换为String并将其保存在包

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);