[英]Android Bundle is shares memory?
我使用setArgument()/ getArgument()将数据从一个片段传递到另一个片段。
我使用Bundle.putParcelableArrayList()将ArrayList存储到bundle中,然后我发现它们-放入数据和获取数据-等于内存。
通常,我认为,可打包源和通过CREATOR再生的实例是另一个实例,但是它们是相同的。
如果Bundle共享内存,那么为什么bundle有几种支持多种数据类型的方法-为什么不仅仅传递Object实例或在Bundle上使用泛型?
为什么bundle有几种支持多种数据类型的方法-为什么不仅仅传递Object实例或在Bundle上使用泛型?
如果Bundle
类只有一种方法可以传递objects
,那就太可怕了,因为这可能会引起混乱。 这些多样化的数据类型方法可以帮助程序员确定他/她想要获取或放入的参数的种类。试想一下这种情况,其中有4位程序员在一个项目上工作,而有1位程序员想要在Bundle
实例中放入一个对象(在本例中例如,假设Bundle类只有一种方法放置对象(多态)
Bundle bundle = new Bundle();
bundle.putObject("animal",new Dog());
然后,一位程序员想要获取该值并执行此操作:
Bundle bundle = getArguments();
Cat variable = bundle.getObject("animal"); //This will cause an Exception, because the argument it returned isn't a Cat class.
这就是为什么Bundle
类具有这些方法以避免此类错误的原因。
现在下一个答案是
或在Bundle上使用通用?
泛型是为了避免使用Casting,并帮助程序员使用Collection框架来避免上述问题。
public final class Bundle implements Parcelable, Cloneable {...}
Bundle实现了Parcelable,系统将自动识别Bundle是否为跨进程,如果不是,则将数据直接通过共享内存传递,因此这次您将一个对象与该对象一起传递实际上是相同,但是如果是跨进程的,则Parcelable接口在跨进程中发挥作用,系统将调用Parcelable的writeToParcel方法,将所有数据转换为字节,然后传递给其他进程,之后再接收其他进程,然后通过Parcelable Creator界面还原数据,通过Creator还原数据肯定不是同一实例。 至于为什么有这么多的捆绑方式,而不是直接使用putObject(Object),getObject(),部分是因为需要Parcelable,不是每个类型都可以捆绑,所以Bundle既然实现了Parcelable,还必须是他需要传递捆绑数据要求也支持包裹
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.