
在Android应用程序中,我将一个Bundle从一个Activity发送到一个Fragment.
public class bar implements Parcelable {private Map<String, String> hash;private int ID;protected bar(Parcel in) { ID = in.readInt();}public bar(int ID, Map<String,String> map){ this.hash=map; this.ID=ID;}public static final Creator<bar> CREATOR = new Creator<bar>() { @OverrIDe public bar createFromParcel(Parcel in) { return new bar(in); } @OverrIDe public bar[] newArray(int size) { return new bar[size]; }};@OverrIDepublic int describeContents() { return 0;}@OverrIDepublic voID writetoParcel(Parcel parcel, int i) { parcel.writeInt(ID);}}我已经使用AndroID Studios实现Parcelable inteli sense帮助并自动生成上面的代码,它没有Map的实现.
当我把这个发送到我的Fragment时:
Map<String,String> map = new HashMap<String, String>(); map.put("foo","bar"); map.put("foobar","barfoo"); bar foo = new bar(1,map); MyFragment fragment = new MyFragment(); Bundle bundle = new Bundle(); fragment.setArguments(bundle); bundle.putParcelable("foo",foo); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.add(R.ID.container, fragment, "foo"); fragmentTransaction.commit();不知何故,Map似乎包含片段中出现的内容.为什么是这样?我会想到的行为是ID被转移并且Map被跳过.
只需创建一个Activity,一个片段和我的bar并将其作为Bundle发送即可重复此 *** 作.
我试过寻找答案,但我不确定如何制定问题.
它是一个应该以这种方式工作的错误或功能吗?
解决方法:
Parceling是懒惰地进行的,这意味着当你将它传递给Fragment时,你的bar实例不会被分割.即writetoParcel未被调用.
Parceling相当昂贵(就资源而言),所以如果可能的话最好避免使用它.如果未将Bundle发送到另一个进程,则无需将其包裹起来.通常在涉及IPC时进行分区.因此,即使在配置更改期间也不需要打包Bundle.但是,如果在活动处于后台时您的进程被终止,则Bundle将被包围,因为它存储在另一个进程中.
当您在Intent中发送它时也是如此.
因此,在您的情况下,当实例被实际分配时,Map将丢失.它只是仍然存在,因为它不是真正的分区,而Fragment接收完全相同的bar实例.
总结以上是内存溢出为你收集整理的java – Parcelable在没有正确实现的情况下工作全部内容,希望文章能够帮你解决java – Parcelable在没有正确实现的情况下工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)