亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android怎么使用EventBus多次接收消息

發布時間:2022-04-24 16:17:37 來源:億速云 閱讀:512 作者:iii 欄目:開發技術

這篇文章主要介紹“Android怎么使用EventBus多次接收消息”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Android怎么使用EventBus多次接收消息”文章能幫助大家解決問題。

場景

Fragment中嵌套Fragment,且被嵌套的Fragment是復用的,點擊其中item后進入詳情,返回后需要回傳數據并刷新列表。

Android怎么使用EventBus多次接收消息

由于是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多次接收消息”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岗巴县| 广南县| 灵璧县| 兴隆县| 宜昌市| 海城市| 凯里市| 红桥区| 扶沟县| 西盟| 铁岭县| 疏勒县| 缙云县| 湄潭县| 阜新| 平泉县| 扎鲁特旗| 黑龙江省| 平舆县| 文登市| 宁津县| 台州市| 乌兰察布市| 松原市| 华池县| 松潘县| 响水县| 海淀区| 许昌县| 柳林县| 株洲市| 抚顺市| 滕州市| 宁陕县| 邵武市| 裕民县| 凤城市| 明溪县| 宁乡县| 贵州省| 巴塘县|