微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – Parcelable在没有正确实现的情况下工作

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 举报,一经查实,本站将立刻删除。

相关推荐