【发布时间】:2015-09-05 06:51:52
【问题描述】:
我正在开发一个 Android 项目,我想将自定义类 MainActivityModel 传递给 Fragment、MainActivityPlaceholderFragment。
我已将MainActivityModel 设为可序列化:
public class MainActivityModel implements Serializable{
public int current = 0;
public int pageCount = 0;
public boolean pristine = true;
// Stores the fetched dataMap
public ArrayList<HashMap<String, String>> arrayList;
public MainActivityModel() {
this.arrayList = new ArrayList<>();
}
public String getCategory() {
return Util.categories[current];
}
public CharSequence getmTitle () {
return Util.toTitleCase(
Util.mapCategoryPretty(Util.categories[current]));
}
}
我将它传递给Fragment,如下所示:
public static MainActivityPlaceholderFragment newInstance(MainActivityModel mainActivityModel) {
MainActivityPlaceholderFragment fragment = new MainActivityPlaceholderFragment();
Bundle args = new Bundle();
args.putSerializable(ARG_DATA_MODEL, mainActivityModel);
fragment.setArguments(args);
Log.v(LOG_TAG, "Created: " + mainActivityModel.getmTitle());
return fragment;
}
我这样访问它:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivityModel = (MainActivityModel) getArguments().getSerializable(ARG_DATA_MODEL);
mMainActivityPlaceholderFragmentView = new MainActivityPlaceholderFragmentView(this, mainActivityModel);
mCallbacks.onPlaceholderFragmentCreated(mainActivityModel.current);
}
我最初认为(在阅读了我在下面提到的答案之后),序列化将数据转换为字节并在需要时随后恢复它们。所以我的对象会被复制。如果我只想访问数据,这没关系。但我也想从片段中修改实际模型(在MainActivity 中引用)。
为了进行实验,我在 Fragment 中将 pristine 设置为 false,并将其记录到 MainActivity 中,确实是错误的。
但如果可序列化是按值传递的,这是怎么回事?
我读过的:
【问题讨论】:
-
它是否可序列化并不重要......捆绑无法处理引用的点......它总是序列化/反序列化(parcel/unparcel)......想想这种情况:具有某些 Intent 的活动进入后台,甚至在您返回它时被杀死......猜猜为什么它会恢复意图?它不是引用...系统只需将其保存到包裹中并在需要时重新创建
-
这是我的问题。如果它正在复制对象,更改如何反映在
MainActivity中?更改应仅限于片段。 -
@prakharsingh95 复制 Object 你理解什么?
-
它不是同一个对象...对原始对象所做的更改将不适用于通过捆绑包传递的对象(我的意思是“在另一侧”的那个)...
-
@AnkurAnand 它将对象转换为字节,当我再次从
Bundleget它们时,它将序列化表示转换为对象。
标签: java android android-fragments serialization pass-by-reference