這裏有很多關於片段通信的問題,但通常是關於從活動獲取數據並將數據發回活動的問題,通常從片段開始。 但我想知道什麼是最好的方法發送數據從活動到片段,當你創建片段時無法做到這一點?爲了澄清,讓我們假設一個應用程序有兩個片段,可以使用(不能)必須的一些數據來改善用戶體驗,但獲取這些數據是昂貴的。因此,在主要活動中使用Loader
或AsyncTask
在活動中獲取此數據,同時自行創建碎片。現在,在Activity中異步準備好數據時,我們需要將這些數據發送到Fragments。什麼是最好的方法呢?我想到了這樣做的一種方式,我想知道這種方法是否存在問題。另一個片段通信
onAttach
發送片段活動,並檢查
1,在片段,如果任何數據已經閱讀:
@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()
來更新所有片段數據。
我不知道這種方法是正確的還是在某些情況下可能不正確?任何想法?有沒有更好的方法來通知主要活動的碎片?
順便說一下,是否可以使用處理程序/消息進行片段之間的通信?作爲另一種方法?
最好的問候
哦,這個ViewModels看起來非常酷。他們可以處理片段/活動數據傳遞良好。 :) 非常感謝。 – Afshin