在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];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public 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实例.
原文地址:https://www.jb51.cc/android/1075104.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。