EventBus的介绍和使用

  • EventBus的介绍
    • 作用
    • 引入
    • 成员
    • 综合小案例:
      • 1,Activity中的布局:
      • 2 Activity中的代码:
      • 3 fragment中的代码:
      • 4 .fragment中的布局只有一个textView 不放代码了.
    • 线程模型
      • 线程模型的用处:
    • 官方网址:

EventBus的介绍

EventBus是一种用于Android的事件发布-订阅总线

作用

它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。

引入

implementation 'org.greenrobot:eventbus:3.2.0'
最新版本可以去官网查看

成员

使用EventBus主要涉及三个成员:

  1. 发送者
    用来在任意线程中,发送数据,参数是Objcet类型.
    java EventBus.getDefault().post(Object o);

  2. 接收者
    用来接收数据.但是接收之前需要在当前的页面注册和注销,方法如下:

 @Override
public void onStart() {super.onStart();EventBus.getDefault().register(this);
}@Override
public void onStop() {super.onStop();EventBus.getDefault().unregister(this);
}
  1. 事件
    可以简单的理解为,需要发送的消息内容,建议封装成一个对象.
    public class MessageEvent { /* Additional fields if needed */ }

这里需要注意一个问题:
就是接收者虽然通过注册方式注册成功了,但是还需要一个方法用来接收发送者传来的数据: 方法如下:

 /*** 方法名称随意.* @param s 发送的参数是什么,接收的参数就是什么.*/@Subscribepublic void getMsg(String s){fgText.setText(s);}

仔细观察这个方法,发现有一个 @Subscribe 这个注解就是EventBus给提供的.作用是来表示此方法是用来接收数据的. 发送者的数据,就是这个方法的参数.所有方法参数要与发送者发送的数据类别保持一致.
此外 这个@Subscribe 注解还可以控制,此方法是运行在ui线程还是子线程中.稍后说明.

综合小案例:

到此,EventBus已经可以简单实用了,我们在做一个如下的案例.
要求,在一个Activity中,有一个输入框,一个button,一个fragment
,我们用EventBus 来显示 Activity给fragment传值.
布局和要求如下:

代码如下:

1,Activity中的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"tools:context=".BusActivity"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/edit"android:hint="输入点啥吧"></EditText><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sendContent"android:text="发送"></Button><fragmentandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/fg"android:name="com.fenghongzhang.day012.BlankFragment"></fragment>
</LinearLayout>

2 Activity中的代码:

package com.fenghongzhang.day012;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;import org.greenrobot.eventbus.EventBus;public class BusActivity extends AppCompatActivity {private EditText edit;private Button sendContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_bus);edit = (EditText) findViewById(R.id.edit);sendContent = (Button) findViewById(R.id.sendContent);sendContent.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String s = edit.getText().toString();EventBus.getDefault().post(s);}});}
}

3 fragment中的代码:

package com.fenghongzhang.day012;import android.os.Bundle;import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;/*** A simple {@link Fragment} subclass.*/
public class BlankFragment extends Fragment {private TextView fgText;public BlankFragment() {// Required empty public constructor}
//    @Override
//    public void onCreate(@Nullable Bundle savedInstanceState) {//        super.onCreate(savedInstanceState);
//        EventBus.getDefault().register(this);
//    }@Overridepublic void onStart() {super.onStart();EventBus.getDefault().register(this);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View inflate = inflater.inflate(R.layout.fragment_blank, container, false);fgText = (TextView) inflate.findViewById(R.id.fg_text);//        fgText.setText(?);return inflate;}/*** 方法名称随意.* @param s 发送的参数是什么,接收的参数就是什么.*/@Subscribepublic void getMsg(String s){fgText.setText(s);}@Overridepublic void onStop() {super.onStop();EventBus.getDefault().unregister(this);}
}

4 .fragment中的布局只有一个textView 不放代码了.

线程模型

EventBus3.0有四种线程模型,分别是:

1, POSTING: 默认,表示事件处理函数的线程跟发布事件的线程在同一个线程。

2, MAIN: 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。

3, BACKGROUND: 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。

4, ASYNC: 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作

线程模型的用处:

因为发送者是可以在任意线程中发送数据的,那么相对的接收者也是可以在任意线程中接收数据,
因为涉及到更新ui或耗时操作的问题,所以要给接收者指定在什么线程中接收.
代码如下:

 /*** 方法名称随意.-* @param s 发送的参数是什么,接收的参数就是什么.*///默认的线程模型@Subscribepublic void getMsg(String s){fgText.setText(s);}//不是发送者是什么线程,我接收者都是在 主 线程中.@Subscribe(threadMode = ThreadMode.MAIN)public void getMsg(String s){fgText.setText(s);}//不是发送者是什么线程,我接收者都是在 子 线程中.@Subscribe(threadMode = ThreadMode.BACKGROUND)public void getMsg(String s){fgText.setText(s);}

官方网址:

https://github.com/greenrobot/EventBus

参考链接:
链接:https://www.jianshu.com/p/e7d5c7bda783

EventBus的介绍和使用相关推荐

  1. EventBus简单介绍

    EventBus简单介绍 EventBus简单介绍 EventBus作用 EventBus优缺点 EventBus使用步骤 EventBus的三要素(三个角色) Event Subscriber Pu ...

  2. EventBus 使用介绍

    EventBus使用起来和Otto差不多,分订阅.注册.发布.取消注册等步骤: 在订阅者类中实现各种事件的订阅函数 public void onEvent(AnyEventType event) {} ...

  3. EventBus使用介绍

    EventBus介绍 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,它利用发布/订阅者者模式来对项目进行解耦,它简化了应用程序内各个组件之间进行通信的复杂度 ...

  4. EventBus的介绍

    什么是EventBus? EventBus是一个Android和Java的开源库,使用发布者/订阅者模式进行松散耦合. EventBus只需几行代码即可实现与分离类的集中通信 - 简化代码,消除依赖关 ...

  5. EventBus介绍

    转自:http://blog.csdn.net/huangyanan1989/article/details/10858695 场景描述 当一个Android应用功能越来越多的时候,保证应用的各个部分 ...

  6. Android 框架炼成 教你怎样写组件间通信框架EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41096639 .本文出自:[张鸿洋的博客] 1.概述 关于Eventbus的介绍 ...

  7. 2018年android常用的框架介绍

    转载地址:http://blog.csdn.net/RuingMan/article/details/73546718 http://www.cnblogs.com/jincheng-yangchao ...

  8. EventBus使用

    EventBus简单介绍 EventBus就是事件总线的意思,个人理解为:我们先把一个个事件(event)发送到总线上,然后EventBus根据已注册的订阅者(subscribers)来匹配相应的事件 ...

  9. js之EventBus

    EventBus 许多现代JavaScript框架和库的核心概念是能够将数据和UI封装在模块化.可重用的组件中.这对于开发人员可以在开发整个应用程序时避免使用编写大量重复的代码.虽然这样做非常有用,但 ...

最新文章

  1. R语言绘制不一样的条形图
  2. 集成测试CDI 1.0和Spring 3.1中的作用域bean
  3. eclipse+ADT 进行android应用签名详解
  4. 「Luogu」[JSOI2007]字符加密 解题报告
  5. 我和Django那些事儿(8)----相册django插件photologue,jQuery插件Slides
  6. linux系统常用操作命令
  7. js里面把密码encode_PHP会员找回密码功能的简单实现
  8. 最简单vivo机器怎么不root激活XPOSED框架
  9. html当前时间插件,HTML日期时间插件
  10. ORA-20011, KUP-11024 外部表引发报错
  11. c盘扩容提示簇被标记_如何解决C盘爆满
  12. 征途服务器修改,征途【改版教程】-装备程序的修改-转载于-喜欢玩网游单机站...
  13. 丁火生于未月命理分析_丁火生于未月的性格特征
  14. 机器学习特征工程之特征缩放+无量纲化:行归一化(范数化,Normalizer)
  15. 组态王图素制作_组态王主界面制作
  16. 缺少msvc140.dll解决办法,缺少任意dll文件的解决办法
  17. 疫情后的数字化转型:如何做好医疗数据治理
  18. YOLOv5改进之八:非极大值抑制NMS算法改进Soft-nms
  19. 2022 学术英语写作(东南大学) 最新Unit 1章节测试答案
  20. PDF分割合并工具 免费,绿色软件

热门文章

  1. c语言编程显示未定义的引用,c – 链接时奇怪的未定义引用
  2. 烧录flash_烧录固件完成后,配置JFLASH让程序自动运行
  3. 王力宏 谭维维-缘分一道桥 【超品质MP3】
  4. OpenCV-Python 级联分类器训练 | 六十三
  5. 普通程序员怎么赚多份钱?解锁更多赚钱新姿势
  6. [Android]搜索框SearchView
  7. 在Markdown中使用Mermaid来绘制流程图
  8. 将 Amazon EC2 到 Amazon S3 的数据传输推向100Gbps线速
  9. iOS身份证的正则验证
  10. Python小程序之购买商品