这里有很多关于片段通信的问题,但它们通常是关于从活动中获取数据并将数据发送回活动的问题,通常从片段开始。
但是我想知道什么是将数据从活动发送到片段的最佳方法,当你在创建片段时无法做到这一点?为了澄清,让我们假设一个应用程序有2个片段,可以使用(不一定)某些数据来改善用户体验,但获取这些数据的成本很高。因此,在主要活动中使用Loader
或AsyncTask
时,在活动中获取此数据,同时自行创建碎片。现在,当数据在Activity中异步准备时,我们需要将此数据发送到Fragments。对此最好的方法是什么?我想到了这样做的方法,我想知道这种方法是否有任何问题。
1-In片段我们使用onAttach
将片段发送到活动并检查是否已读取任何数据:
@Override
public void onAttach (Activity activity) {
MyActivity act = (MyActivity)activity;
act.addFragment(this);
Data data = act.getData();
if (data != null) {
setAdditionData(data)
}
}
2 - 并且在活动中将WeakReference
存储到片段:
private ArrayList<WeakReference<Fragment>> mFragments = new ArrayList<>();
...
public void addFragment(Fragment frag) {
WeakReference<Fragment> f = new WeakReference<Fragment>(frag);
mFragments.add(f);
}
public Data getData() {
return mData;
}
public void updateFragmentsData() {
for (Iterator<WeakReference<Fragment>> iterator = mFragments.iterator(); iterator.hasNext();) {
WeakReference<Fragment> wf = iterator.next();
Fragment f = wf.get();
if (f != null) {
f.setAdditionData(mData);
} else {
iterator.remove();
}
}
}
现在,当片段附加时,它会将自身添加到活动中的片段列表中,并检查数据是否已准备就绪,如果准备就绪,它将使用该数据。另一方面,当数据在活动中异步准备时,它可以调用updateFragmentsData()
来更新所有片段数据。
我想知道这种方法是否正确或在某些情况下可能不正确?任何的想法?是否有更好的方法来通知主要活动中的碎片?
顺便说一下,是否可以使用Handler / Message在片段之间进行通信?作为另一种方法?
最好的问候
答案 0 :(得分:0)
我可以想到三种方式。