您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android怎么使用EventBus多次接收消息”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android怎么使用EventBus多次接收消息”文章能幫助大家解決問題。
Fragment中嵌套Fragment,且被嵌套的Fragment是復用的,點擊其中item后進入詳情,返回后需要回傳數據并刷新列表。
由于是Fragment之間的相互嵌套,不方便使用Intent返回數據,也不方便使用callback回調來返回數據,所以選擇了使用EventBus發送消息,但是發現在列表中使用EventBus發送消息后,Fragment中接收消息的方法會執行多次。
發送消息:
EventBus.getDefault().post(new TestEvent());
接收消息:
@Subscribe(threadMode = ThreadMode.MAIN) public void onTestEvent(TestEvent event) { onSwipeRefresh(); }
也就是onTestEvent方法會被調用多次,數據也會多次刷新。
原因分析
因為Fragment是復用的,而EventBus訂閱消息也在復用的Fragment中,導致該消息被多次訂閱。以ItemFragment為例。
public class ItemFragment extends Fragment { private static final String ARG_COLUMN_COUNT = "column-count"; private int mColumnCount = 1; public ItemFragment() { } @SuppressWarnings("unused") public static ItemFragment newInstance(int columnCount) { ItemFragment fragment = new ItemFragment(); Bundle args = new Bundle(); args.putInt(ARG_COLUMN_COUNT, columnCount); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT); } } @Override public void onStart() { super.onStart(); // 訂閱消息 EventBus.getDefault().register(this); } @Override public void onStop() { super.onStop(); // 注銷訂閱 EventBus.getDefault().unregister(this); } }
復用ItemFragment:
public class HomeFragment extends Fragment { private int activeColor = Color.parseColor("#ffffff"); private int normalColor = Color.parseColor("#666666"); private final String[] tabs = new String[]{"第一頁", "第二頁", "第三頁", "第四頁", "第五頁"}; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... vp2.setAdapter(new FragmentStateAdapter(getActivity().getSupportFragmentManager(), getLifecycle()) { @NonNull @Override public Fragment createFragment(int position) { return ItemFragment.newInstance(position + 10); } @Override public int getItemCount() { return tabs.length; } }); ... }
因為創建了5個ItemFragment對象,所以EventBus被訂閱了5次,所以消息時也會被接收5次。
解決方案
1、提前在宿主Activity中進行EventBus消息訂閱,但是該方法不適合多層級的Fragment嵌套,EventBus訂閱不成功,也就接收不到消息。
2、在Fragment中添加標簽,識別當前的Fragment。
@Override public void onStart() { super.onStart(); // 2 是需要接收消息的Fragment的索引 if(2 == position) { EventBus.getDefault().register(this); } } @Override public void onStop() { super.onStop(); if( 2 == position) { EventBus.getDefault().unregister(this); } }
復用的Fragment中只有索引為2的Fragment才會訂閱消息,所以發送消息的時候只有索引為2的Fragment才能接收到消息,也就解決了多次接收消息的問題。
3、消息中添加標記。
@Subscribe(threadMode = ThreadMode.MAIN) public void onTestEvent(TestEvent event) { if (event != null) { // 2 是需要接收消息的Fragment的索引 if(event.getPosition() == 2){ onSwipeRefresh(); } } }
EventBus在post消息的時候,把需要哪一個頁面刷新的position發送,接收消息時識別根據索引判斷需要哪一個頁面刷新。不一定要Fragment的position,只要能唯一識別Fragment就行。
關于“Android怎么使用EventBus多次接收消息”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。