EventBus使用详解

EventBus是针一款对Android的发布/订阅事件总线。它可以让我们很轻松的实现在Android各个组件之间传递消息,并且代码的可读性更好,耦合度更低。长话短说直接介绍使用。

如何使用 (以下介绍一下 活动和intentService之间的通信)

(1)首先需要定义一个消息类,该类可以不继承任何基类也不需要实现任何接口。我是单独建一个文件存放这个类 如:

1public class MessageEvent { 2 3 private String message; 4 5 public MessageEvent(String message) { 6 this.message = message; 7 } 8 9 public String getMessage() { 10 return message; 11 } 12 13 public void setMessage(String message) { 14 this.message = message; 15 } 16}

(2)在需要订阅事件的地方注册事件

1protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 //注册事件 5 EventBus.getDefault().register(this); //这里是注册事件 请注意这里 6 7 8 Button startService = (Button) findViewById(R.id.startIntentService); 9 startService.setOnClickListener(this); 10 11 SpeechUtility. createUtility(this, SpeechConstant. APPID + "=5b02688c" ); 12 13 handler=new Handler(); 14 handler.postDelayed(runnable, 1000);//每1秒执行一次runnable. 15 16// startMyService(getApplicationContext()); 17 18 }

(3)产生事件,即发送消息 (在 intentService 里面需要发送数据的地方 发送消息)

EventBus.getDefault().post(new MessageEvent("problem:"+textString));

(4)处理消息  (在activity 里面接收消息 并且处理 我只是显示出来了)

1@Subscribe(threadMode = ThreadMode.MainThread) 2public void onMessageEventMainThread(MessageEvent messageEvent) { 3 Log.i("MainThread", messageEvent.getMessage()); 4 Toast.makeText(this, messageEvent.getMessage(), Toast.LENGTH_SHORT).show(); 5 6}

(5)取消消息订阅(在活动结束的时候 取消消息订阅)

1 @Override 2 protected void onDestroy() { 3 super.onDestroy(); 4 //取消事件注册 5 EventBus.getDefault().unregister(this); 6 7 }

线程模型

在EventBus的事件处理函数中需要指定线程模型,即指定事件处理函数运行所在的想线程。在上面我们已经接触到了EventBus的四种线程模型。那他们有什么区别呢?
在EventBus中的观察者通常有四种线程模型,分别是PostThread(默认)、MainThread、BackgroundThread与Async。

  • PostThread:如果使用事件处理函数指定了线程模型为PostThread,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为PostThread的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起ANR。
  • MainThread:如果使用事件处理函数指定了线程模型为MainThread,那么不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行。该方法可以用来更新UI,但是不能处理耗时操作。
  • BackgroundThread:如果使用事件处理函数指定了线程模型为BackgroundThread,那么如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
  • Async:如果使用事件处理函数指定了线程模型为Async,那么无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行。同样,此事件处理函数中禁止进行UI更新操作。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )