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实例.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...