返回顶部
首页 > 资讯 > 精选 >Android怎么使用EventBus多次接收消息
  • 190
分享到

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

2023-06-30 09:06:00 190人浏览 独家记忆
摘要

这篇文章主要介绍“Android怎么使用EventBus多次接收消息”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么使用EventBus多次接收消息”文章能帮助大家解决问题。场景Fr

这篇文章主要介绍“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次。

解决方案

提前在宿主Activity中进行EventBus消息订阅,但是该方法不适合多层级的Fragment嵌套,EventBus订阅不成功,也就接收不到消息。

在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才能接收到消息,也就解决了多次接收消息的问题。

消息中添加标记。

@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多次接收消息”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Android怎么使用EventBus多次接收消息

本文链接: https://lsjlt.com/news/328006.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android使用EventBus多次接收消息
    场景 Fragment中嵌套Fragment,且被嵌套的Fragment是复用的,点击其中item后进入详情,返回后需要回传数据并刷新列表。 由于是Fragment之间的相互嵌套,...
    99+
    2024-04-02
  • Android怎么使用EventBus多次接收消息
    这篇文章主要介绍“Android怎么使用EventBus多次接收消息”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么使用EventBus多次接收消息”文章能帮助大家解决问题。场景Fr...
    99+
    2023-06-30
  • rabbitmq怎么一次接收多条消息
    要一次接收多条消息,可以使用RabbitMQ的BasicQos方法和BasicConsume方法。首先,使用BasicQos方法设置...
    99+
    2023-10-20
    rabbitmq
  • Android 消息分发使用EventBus的实例详解
    Android 消息分发使用EventBus的实例详解1. AndroidStudio使用dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高E...
    99+
    2023-05-30
    android eventbus roi
  • C#怎么使用udp实现消息的接收和发送
    本篇内容主要讲解“C#怎么使用udp实现消息的接收和发送”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么使用udp实现消息的接收和发送”吧!使用udp实现消息的接收和发送代码比较简单,但是...
    99+
    2023-07-05
  • Spring Boot中怎么使用@KafkaListener并发批量接收消息
    这篇“Spring Boot中怎么使用@KafkaListener并发批量接收消息”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一...
    99+
    2023-07-05
  • rabbitmq接收不到消息怎么解决
    如果你在使用 RabbitMQ 时无法接收到消息,可以尝试以下方法解决: 检查连接状态:确保你的应用程序或客户端与 Rabbit...
    99+
    2024-02-29
    rabbitmq
  • Android怎么使用广播发送消息
    本文小编为大家详细介绍“Android怎么使用广播发送消息”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么使用广播发送消息”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体效果如下activit...
    99+
    2023-06-30
  • Springboot中RocketMQ怎么实现消息发送与接收
    本文小编为大家详细介绍“Springboot中RocketMQ怎么实现消息发送与接收”,内容详细,步骤清晰,细节处理妥当,希望这篇“Springboot中RocketMQ怎么实现消息发送与接收”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-07-02
  • C#使用udp如何实现消息的接收和发送
    目录使用udp实现消息的接收和发送C# 运用UDP服务端界面客户端界面总结使用udp实现消息的接收和发送 代码比较简单,但是别忘记关闭防火墙进行测试。 首先便是服务端,使用Socke...
    99+
    2023-02-26
    C#使用udp udp消息接收 udp消息发送
  • Android怎么使用Toast显示消息提示框
    可以使用以下代码在Android中使用Toast显示消息提示框:```Toast.makeText(context, "消息内容",...
    99+
    2023-08-15
    Android Toast
  • 微信小程序API接收消息和事件怎么实现
    今天小编给大家分享一下微信小程序API接收消息和事件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。接收消息和事件在页...
    99+
    2023-06-26
  • node消息队列怎么使用
    这篇文章主要介绍“node消息队列怎么使用”,在日常操作中,相信很多人在node消息队列怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”node消息队列怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-05
  • Linux消息队列怎么使用
    在Linux中,消息队列是一种进程间通信的机制,用于在不同进程之间传递数据。下面是使用Linux消息队列的步骤: 包含头文件: ...
    99+
    2023-10-22
    Linux
  • 怎么使用redis消息队列
    要使用Redis作为消息队列,你需要按照以下步骤进行操作:1. 安装并启动Redis服务。2. 在你的应用程序中引入Redis的客户...
    99+
    2023-08-24
    redis
  • 怎么使用django+celery+RabbitMQ自定义多个消息队列
    本篇内容主要讲解“怎么使用django+celery+RabbitMQ自定义多个消息队列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用django+celery+RabbitMQ自定义多...
    99+
    2023-07-05
  • 如何在spring boot中使用spring-kafka实现一个接收消息功能
    本篇文章为大家展示了如何在spring boot中使用spring-kafka实现一个接收消息功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现方法pom.xml文件如下<&#63...
    99+
    2023-05-31
    springboot spring-kafka
  • node中怎么使用消息队列
    这篇“node中怎么使用消息队列”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“node中怎...
    99+
    2024-04-02
  • android中bindservice多次调用怎么实现
    在Android中,可以通过以下步骤实现多次调用bindService: 创建一个ServiceConnection对象,用于监听...
    99+
    2024-02-29
    android
  • 怎么使用spring的消息转换器
    这篇文章给大家介绍怎么使用spring的消息转换器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体内容如下//domainpackage com.crazy.goods.tools;public class Phon...
    99+
    2023-05-31
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作