EventBus事件总线分发库

本文围绕以下六个部分展开:

一、事件总线管理

二、EventBus

三、EventBus与BroadcastReceiver的区别

案例一

案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据

案例三:Activity和Service之间互相发布与接收事件

一、事件总线管理

将事件放入队列里,用于管理和分发。

(1)保证应用的各个部分之间高效的通信及数据、事件分发。

(2)模块间解耦:通过事件的分发,可以让各个模块间关联程序变小。

当在开发一些庞大的的项目时,模块比较多,这个时候为了避免耦合度和保证 APP 的效率,会用到 EventBus 等类似的事件总线处理模型。这样可以简化一些数据传输操作,保证APP的简洁,做到高内聚、低耦合。

二、EventBus

1. 概念

EventBus是一个发布/订阅的事件总线。它可以让两个组件相互通信,但是它们之间并不相互知晓。

EventBus模式,也被称为 Message Bus模式,或者 发布者/订阅者(publisher/subscriber)模式。

事件响应有更多的线程选择,EventBus 可以向不同的线程中发布事件。

EventBus 支持 Sticky Event。

2. 有3个主要的元素:

(1)Event:事件。

Event可以是任意类型的对象。

(2)Subscriber:事件订阅者,接收特定的事件。

在EventBus中,使用约定来指定事件订阅者以简化使用。即,所有事件订阅都是以onEvent开头的函数。具体来说,函数的名字是onEventMainThread,onEventPostThread,onEventBackgroundThread,onEventAsync这四个,onEvent是默认的接收数据处理的方法。这四个事件订阅函数,每个都与一个“ThreadMode”相关联,ThreadMode指定了会调用的函数。有以下4个ThreadMode:

1)PostThread:事件的处理和事件的发送在相同的进程。

事件处理时间不应太长,不然影响事件的发送线程,而这个线程可能是UI线程。对应的函数名是onEvent。

2)MainThread:事件的处理会在UI线程中执行。

事件处理时间不应太长,长了会ANR的。对应的函数名是onEventMainThread。

3)BackgroundThread:事件的处理会在一个后台线程中执行。

虽然事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接执行事件。如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。对应的函数名是onEventBackgroundThread。

4)AsyncThread:事件处理会在单独的线程中执行。

主要用于在后台线程中执行耗时操作,每个事件会开启一个线程(有线程池),但最好限制线程的数目。

根据事件订阅的函数名称的不同,会使用不同的ThreadMode。比如在后台线程加载了数据想在UI线程显示,订阅者只需把函数命名为onEventMainThread。

3. 基本用法

分 注册订阅发布取消注册 等步骤。使用时需先注册、订阅,然后向订阅者发布消息数据即可。

(1)注册(3个构造方法):

EventBus.getDefault().register(this);

EventBus.getDefault().register(new MyClass());

// 注册三个参数分别是:消息订阅者(接收者),接收方法名,事件类。
        
EventBus.getDefault().register(this,"setTextA",SetTextAEvent.class);

(2)注销注册:

EventBus.getDefault().unregister(this);

EventBus.getDefault().unregister(new MyClass());

(3)定义事件类型:

public class MyEvent {}

(4)订阅处理数据:

public void onEvent(AnyEventType event){}:默认的接收数据处理的方法

public void onEventMainThread{}

onEventPostThread

onEventBackgroundThread

onEventAsync

(5)发布:

EventBus.getDefault().postSticky(new SecondActivityEvent("Message from SecondActivity"));

EventBus.getDefault().post(new ChangeImgEvent(1));

三、EventBus与BroadcastReceiver的区别

1. 二者类似。

在Android中广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器)。

广播:在一个地方注册广播,在另一个地方针对action发送广播、传递数据,对应注册的地方就可以收到广播。

EventBus:基于订阅/发布的模式。在需要接收数据的地方,进行注册与订阅,在需要发布数据的地方发布,则在注册的地方就可以收到了。

简单点说,就是两人约定好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus就可以帮助减少做很多事,不管你在任何地方任何位置发布一个事件,接收者都能立马接收到你的消息,不用你考虑android子线程操作UI线程的问题。

2. 二者区别。

(1)EventBus 有三个主要的元素:事件、订阅和发布。广播两个元素:订阅和发布,但是广播是针对整个App而言的。

(2)BroadcastReceiver是组件,需要在功能清单中注册。而EventBus 不需要注册。

(3)BroadcastReceiver只能做一件事情,而EventBus多事件处理比较好。

(4)在不同场景中的适用性:

1)同一App内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若使用广播机制,显然有些“杀鸡牛刀”的感觉。

2)同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对同一进程,用于处理此类需求非常适合,且轻松。

3)其他情形,由于涉及不同进程间的消息通信,此时根据实际业务使用广播机制会显得非常适宜。

案例一

MainActivity

Java代码  

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. // 1. 注册
  7. EventBus.getDefault().register(this);
  8. }
  9. /**
  10. * 3. 发送数据消息事件
  11. */
  12. private void postData() {
  13. String string = "我是消息";
  14. EventBus.getDefault().post(string);
  15. }
  16. /**
  17. * 2. 接收数据消息事件
  18. */
  19. public void onEvent(String string) {
  20. }
  21. public void onEventMainThread(String string) {
  22. }
  23. public void onEventPostThread(String string) {
  24. }
  25. public void onEventBackgroundThread(String string) {
  26. }
  27. public void onEventAsync(String string) {
  28. }
  29. @Override
  30. protected void onDestroy() {
  31. super.onDestroy();
  32. // 4. 取消注册
  33. EventBus.getDefault().unregister(this);
  34. }
  35. }

案例二:一处点击发送数据,另一处或多处注册点可以及时获取更新传输过来的数据

1. activity_main.xml。写一个按钮和一个文本框。

Xml代码  

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity">
  10. <Button
  11. android:id="@+id/btnSend"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:text="发送事件"/>
  15. <TextView
  16. android:id="@+id/tvContent"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_below="@id/btnSend"
  20. android:gravity="center"
  21. android:textSize="20sp"/>
  22. </RelativeLayout>

2. MainActivity。声明和初始化两个控件。

Java代码  

  1. private TextView tvContent;
  2. private Button btnSend;

Java代码  

  1. tvContent = (TextView) findViewById(R.id.tvContent);
  2. btnSend = (Button) findViewById(R.id.btnSend);

3. MainActivity。onCreate()方法中注册。

Java代码  

  1. EventBus.getDefault().register(this);

4. MainActivity。onDestroy()方法中取消注册。

Java代码  

  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. EventBus.getDefault().unregister(this);
  5. }

5. MainActivity。通过事件监听器设置按钮的点击事件。

Java代码  

  1. btnSend.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. }
  5. });

6. 创建自定义的事件类:MyEvent。

Java代码  

  1. package com.android.eventbustwo;
  2. /**
  3. * 自定义的事件类
  4. */
  5. public class MyEvent {
  6. private String type;
  7. private String content;
  8. public String getType() {
  9. return type;
  10. }
  11. public void setType(String type) {
  12. this.type = type;
  13. }
  14. public String getContent() {
  15. return content;
  16. }
  17. public void setContent(String content) {
  18. this.content = content;
  19. }
  20. }

7. MainActivity。在按钮点击事件中,创建自定义事件类MyEvent的实例事件,并当点击按钮的时候,发送事件。

Java代码  

  1. btnSend.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. MyEvent event = new MyEvent();
  5. event.setType("0");
  6. event.setContent("0内容");
  7. // 发送数据事件
  8. EventBus.getDefault().post(event);
  9. }
  10. });

8. MainActivity。通过onEvent()订阅(接收)事件。

Java代码  

  1. public void onEvent(MyEvent event){
  2. if(event.getType().equals("0")){
  3. tvContent.setText(event.getContent());
  4. }
  5. }

运行效果如下:

9. MainActivity。在按钮点击事件中,将事件类型和内容改变,并当点击按钮的时候,发送事件。

Java代码  

  1. btnSend.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. MyEvent event = new MyEvent();
  5. event.setType("1");
  6. event.setContent("1内容");
  7. // 发送数据事件
  8. EventBus.getDefault().post(event);
  9. }
  10. });

10. MainActivity。通过onEventMainThread()同样可以订阅(接收)事件。

Java代码  

  1. public void onEventMainThread(MyEvent event){
  2. if(event.getType().equals("1")){
  3. tvContent.setText(event.getContent());
  4. }
  5. }

运行效果如下:

代码补充:

1. activity_main.xml

2. MainActivity

Java代码  

  1. package com.android.eventbustwo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.Menu;
  5. import android.view.MenuItem;
  6. import android.view.View;
  7. import android.widget.Button;
  8. import android.widget.TextView;
  9. import de.greenrobot.event.EventBus;
  10. public class MainActivity extends Activity {
  11. // 2.
  12. private TextView tvContent;
  13. private Button btnSend;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. // 3.
  19. tvContent = (TextView) findViewById(R.id.tvContent);
  20. btnSend = (Button) findViewById(R.id.btnSend);
  21. // 6.
  22. btnSend.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. // 8.
  26. MyEvent event = new MyEvent();
  27. event.setType("0");
  28. event.setContent("0内容");
  29. // 发送数据事件
  30. EventBus.getDefault().post(event);
  31. }
  32. });
  33. // 4.
  34. EventBus.getDefault().register(this);
  35. }
  36. /**
  37. * 9.
  38. * @param event
  39. */
  40. public void onEvent(MyEvent event){
  41. if(event.getType().equals("0")){
  42. tvContent.setText(event.getContent());
  43. }
  44. }
  45. /**
  46. * 10.
  47. * @param event
  48. */
  49. public void onEventMainThread(MyEvent event){
  50. if(event.getType().equals("1")){
  51. tvContent.setText(event.getContent());
  52. }
  53. }
  54. /**
  55. * 5.
  56. */
  57. @Override
  58. protected void onDestroy() {
  59. super.onDestroy();
  60. EventBus.getDefault().unregister(this);
  61. }
  62. // -----------------------------------------------------------
  63. @Override
  64. public boolean onCreateOptionsMenu(Menu menu) {
  65. // Inflate the menu; this adds items to the action bar if it is present.
  66. getMenuInflater().inflate(R.menu.menu_main, menu);
  67. return true;
  68. }
  69. @Override
  70. public boolean onOptionsItemSelected(MenuItem item) {
  71. // Handle action bar item clicks here. The action bar will
  72. // automatically handle clicks on the Home/Up button, so long
  73. // as you specify a parent activity in AndroidManifest.xml.
  74. int id = item.getItemId();
  75. //noinspection SimplifiableIfStatement
  76. if (id == R.id.action_settings) {
  77. return true;
  78. }
  79. return super.onOptionsItemSelected(item);
  80. }
  81. }

3. MyEvent

Java代码  

  1. package com.android.eventbustwo;
  2. /**
  3. * 7. 自定义的事件类
  4. */
  5. public class MyEvent {
  6. private String type;
  7. private String content;
  8. public String getType() {
  9. return type;
  10. }
  11. public void setType(String type) {
  12. this.type = type;
  13. }
  14. public String getContent() {
  15. return content;
  16. }
  17. public void setContent(String content) {
  18. this.content = content;
  19. }
  20. }

案例三:Activity和Service之间互相发布与接收事件

主活动有4家公司名显示,当在文本框中输入“Amazon”,点击按钮后,将新的公司名显示在主活动界面上。

1. 创建一个Service: EventService。

2. EventService。将onBind中的异常去掉,改为 返回null。

Java代码  

  1. @Override
  2. public IBinder onBind(Intent intent) {
  3. return null;
  4. }

3. activity_main.xml。一个显示的文本框,用于显示Service发布的事件;一个可编辑文本框,用于输入字符串,并发布事件到Service;一个按钮,通过点击按钮,发布事件,然后Service进行订阅。

Xml代码  

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity">
  10. <TextView
  11. android:id="@+id/tvCompany"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="@string/hello_world" />
  15. <EditText
  16. android:id="@+id/txtCompany"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_below="@id/tvCompany"
  20. android:hint="@string/txt_company" />
  21. <Button
  22. android:id="@+id/btnCompany"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:layout_below="@id/txtCompany"
  26. android:text="@string/btn_send_company" />
  27. </RelativeLayout>

4. EventService。重写onCreate()、onStartCommand()、onDestroy()方法。

5. EventService。声明一个 List 集合,用于放公司名的集合,并在onCreate()方法中创建实例(ArrayList类型)。

Java代码  

  1. private List<String> list;

Java代码  

  1. list = new ArrayList<>();

6. EventService。在onStartCommand()方法中,往List集合中添加元素(公司名)。销毁(onDestroy())的时候,集合设为null。

Java代码  

  1. list.add("Google");
  2. list.add("Facebook");
  3. list.add("Twitter");
  4. list.add("Apple");

Java代码  

  1. list = null;

8. EventService。onCreate()中注册EventBus,onDestroy()销毁时注销注册。

Java代码  

  1. EventBus.getDefault().register(this);

Java代码  

  1. EventBus.getDefault().unregister(this);

9. MainActivity。onCreate()中同样注册EventBus,onDestroy()销毁时同样注销注册。

10. 新建一个目录:event,用来放事件类。

11. 在event目录下,新建一个用于从 Service 发布集合数据(公司名的集合)集合事件类:ListEvent。

Java代码  

  1. public class ListEvent {
  2. // 集合
  3. private List<String> list;
  4. // 含参构造方法
  5. public ListEvent(List<String> list) {
  6. this.list = list;
  7. }
  8. // getter方法(只需getter方法)
  9. public List<String> getList() {
  10. return list;
  11. }
  12. }

12. 在event目录下,新建一个用于从 Activity 发布字符串(公司名)的集合事件类:CompanyEvent。

Java代码  

  1. public class CompanyEvent {
  2. // 字符串 company
  3. private String company;
  4. // 含参构造方法
  5. public CompanyEvent(String company) {
  6. this.company = company;
  7. }
  8. // getter方法(只需getter方法)
  9. public String getCompany() {
  10. return company;
  11. }
  12. }

13. MainActivity。在按钮点击事件中,发布事件。

Java代码  

  1. @OnClick(R.id.btnCompany)
  2. public void btnCompanyClick() {
  3. // 获得 在 txtCompany 文本框中输入的 company 字符串 的值
  4. String company = txtCompany.getText().toString();
  5. // Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,
  6. //                          使用 CompanyEvent 发布过去
  7. EventBus.getDefault().post(new CompanyEvent(company));
  8. // 发布之后,将 文本框内容清空
  9. txtCompany.setText("");
  10. }

14. EventService。Service订阅事件,将Activity发布的公司名加入List集合中。然后,再将最新的公司名List集合发布出去。

Java代码  

  1. /**
  2. * Service 订阅事件
  3. * @param event
  4. */
  5. public void onEvent(CompanyEvent event){
  6. // 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中
  7. list.add(event.getCompany());
  8. // 再将 list集合,发布给 Activity,
  9. // 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值
  10. EventBus.getDefault().postSticky(new ListEvent(list));
  11. }

15. MainActivity。Activity 订阅了ListEvent事件,所以接收到了Service发布的公司名List集合的值,然后将其显示在控制台和界面的文本上。

Java代码  

  1. /**
  2. * Activity 订阅事件
  3. *
  4. * @param event
  5. */
  6. public void onEvent(ListEvent event) {
  7. // 从Service发布的事件中获得 参数值(list集合)
  8. List<String> list = event.getList();
  9. // 日志输出 list集合的值 (控制台显示 list集合的值)
  10. Log.v(TAG, list.toString());
  11. // 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)
  12. tvCompany.setText(list.toString());
  13. }

代码目录结构:

补充代码:

(1)EventService。

Java代码  

  1. package com.android.eventbusservice;
  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.os.IBinder;
  5. import android.util.Log;
  6. import com.android.eventbusservice.event.CompanyEvent;
  7. import com.android.eventbusservice.event.ListEvent;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import de.greenrobot.event.EventBus;
  11. public class EventService extends Service {
  12. private static final String TAG = "MainActivity";
  13. // 声明一个 List 集合 -- 用于放公司名的集合
  14. private List<String> list;
  15. public EventService() {
  16. }
  17. @Override
  18. public void onCreate() {
  19. super.onCreate();
  20. Log.v(TAG,"Service.onCreate");
  21. // 当前组件注册事件
  22. // (注册事件后,一定要有 onEvent() 方法,否则报错)
  23. EventBus.getDefault().register(this);
  24. // 创建实例 - ArrayList类型
  25. list = new ArrayList<>();
  26. }
  27. /**
  28. * 此方法系统自动调用,不写也可。可把里面的代码写入 onCreate()里面。
  29. */
  30. @Override
  31. public int onStartCommand(Intent intent, int flags, int startId) {
  32. Log.v(TAG,"Service.onStartCommand");
  33. // 往集合中添加元素
  34. list.add("Google");
  35. list.add("Facebook");
  36. list.add("Twitter");
  37. list.add("Apple");
  38. // Service 发布事件 -- 将 list 集合,使用 ListEvent 发送过去
  39. //                (ListEvent:用于从 Service 传事件到 Activity)
  40. EventBus.getDefault().postSticky(new ListEvent(list));
  41. // 改为:返回 START_STICKY
  42. return START_STICKY;
  43. }
  44. @Override
  45. public void onDestroy() {
  46. super.onDestroy();
  47. Log.v(TAG, "Service.onDestroy");
  48. // 销毁的时候,取消事件
  49. EventBus.getDefault().unregister(this);
  50. // 销毁的时候,集合设为空
  51. list = null;
  52. }
  53. /**
  54. * Service 订阅事件
  55. * @param event
  56. */
  57. public void onEvent(CompanyEvent event){
  58. // 将 事件中传过来的、在 txtCompany 文本框中输入的 company 字符串,放入 list集合中
  59. list.add(event.getCompany());
  60. // 再将 list集合,发布给 Activity,
  61. // 这样,Activity订阅后,就可以在 控制台和界面上 显示最新的 list集合的值
  62. EventBus.getDefault().postSticky(new ListEvent(list));
  63. }
  64. @Override
  65. public IBinder onBind(Intent intent) {
  66. return null;
  67. }
  68. }

(2)MainActivity。

Java代码  

  1. package com.android.eventbusservice;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.widget.EditText;
  9. import android.widget.TextView;
  10. import com.android.eventbusservice.event.CompanyEvent;
  11. import com.android.eventbusservice.event.ListEvent;
  12. import java.util.List;
  13. import butterknife.ButterKnife;
  14. import butterknife.InjectView;
  15. import butterknife.OnClick;
  16. import de.greenrobot.event.EventBus;
  17. public class MainActivity extends Activity {
  18. private static final String TAG = "MainActivity";
  19. @InjectView(R.id.tvCompany)
  20. TextView tvCompany;
  21. @InjectView(R.id.txtCompany)
  22. EditText txtCompany;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. ButterKnife.inject(this);
  28. // 在 Activity 中同样注册事件
  29. EventBus.getDefault().register(this);
  30. // 启动服务 -- 使用 startService 方式启动
  31. // 启动服务后,activity与service脱钩了。
  32. // 但是可以通过黄油刀进行联系。
  33. startService(new Intent(this, EventService.class));
  34. }
  35. @Override
  36. protected void onDestroy() {
  37. super.onDestroy();
  38. // 在 Activity 中同样注销事件
  39. EventBus.getDefault().unregister(this);
  40. }
  41. @OnClick(R.id.btnCompany)
  42. public void btnCompanyClick() {
  43. // 获得 在 txtCompany 文本框中输入的 company 字符串 的值
  44. String company = txtCompany.getText().toString();
  45. // Activity 发布事件 --- 将 在 txtCompany 文本框中输入的 company 字符串,
  46. //                          使用 CompanyEvent 发布过去
  47. EventBus.getDefault().post(new CompanyEvent(company));
  48. // 发布之后,将 文本框内容清空
  49. txtCompany.setText("");
  50. }
  51. /**
  52. * Activity 订阅事件
  53. *
  54. * @param event
  55. */
  56. public void onEvent(ListEvent event) {
  57. // 从Service发布的事件中获得 参数值(list集合)
  58. List<String> list = event.getList();
  59. // 日志输出 list集合的值 (控制台显示 list集合的值)
  60. Log.v(TAG, list.toString());
  61. // 将 list集合的值 显示在 tvCompany 文本中。(界面的文本上 显示 list集合的值)
  62. tvCompany.setText(list.toString());
  63. }
  64. // ---------------------------------------------------------
  65. @Override
  66. public boolean onCreateOptionsMenu(Menu menu) {
  67. // Inflate the menu; this adds items to the action bar if it is present.
  68. getMenuInflater().inflate(R.menu.menu_main, menu);
  69. return true;
  70. }
  71. @Override
  72. public boolean onOptionsItemSelected(MenuItem item) {
  73. // Handle action bar item clicks here. The action bar will
  74. // automatically handle clicks on the Home/Up button, so long
  75. // as you specify a parent activity in AndroidManifest.xml.
  76. int id = item.getItemId();
  77. //noinspection SimplifiableIfStatement
  78. if (id == R.id.action_settings) {
  79. return true;
  80. }
  81. return super.onOptionsItemSelected(item);
  82. }
  83. }

整理时重点参考:http://www.jikexueyuan.com/course/933.html

时间: 2024-10-19 17:48:58

EventBus事件总线分发库的相关文章

45、Android事件总线分发库的使用

事件总线分发库EventBus和Otto的简介及对比 什么是事件总线管理: a.将事件放到队列里,用于管理和分发b.保证应用的各个部分之间高效的通信及数据.事件分发c.模块间解耦 Event Bus是一个发布 / 订阅的事件总线.Event Bus模式 — 也被称为Message Bus或者发布者/订阅者(publisher/subscriber)模式 — 可以让两个组件相互通信,但是他们之间并不相互知晓. 基于事件总线管理/订阅/分发模式的.事件响应有更多的线程选择,EventBus可以向不同

Android事件总线分发库EventBus3.0的简单讲解与实践

Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅.以及将发送者和接收者解耦.反正能帮助我们快速开发,这个确实是个好东西,其实鸿洋大神已经对源码作了一个较全面的剖析了 Android EventBus源码解析 带你深入理解Ev

Guava - EventBus(事件总线)

Guava在guava-libraries中为我们提供了事件总线EventBus库,它是事件发布订阅模式的实现,让我们能在领域驱动设计(DDD)中以事件的弱引用本质对我们的模块和领域边界很好的解耦设计. 不再多的废话,直奔Guava EventBus主题.首先Guava为我们提供了同步事件EventBus和异步实现AsyncEventBus两个事件总线,他们都不是单例的,官方理由是并不想我们我们的使用方式.当然如果我们想其为单例,我们可以很容易封装它,一个单例模式保证只创建一个实例就对了. 下面

Android EventBus事件总线剖析

概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息. 它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码去实现多个模块之间的通信,而不需要以层层传递接口的形式去单独构建通信桥梁.从而降低因多重回调导致的模块间强耦合,同时避免产生大量内部类.它拥有使用方便,性能高,接入成本低和支持多线程的优点,实乃模块解耦.代码重构必备良药.

EventBus 事件总线 简介 案例

简介 地址:https://github.com/greenrobot/EventBus EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息. 优点是开销小,代码更优雅,以及将发送者和接收者解耦. 包含4个成分:发布者,订阅者,事件,总线. 这四者的关系:订阅者订阅事件到总线,发送者发布事件:订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时

Orchard EventBus 事件总线及 IEventHandler作用

事件总线接口定义: public interface IEventBus : IDependency { IEnumerable Notify(string messageName, IDictionary<string, object> eventData); } messageName 参数说明 : _eventBus.Notify(interfaceName + "." + methodName, data/*接口方法参数*/); 事件总线作用: 当调用Notify时

EventBus 事件总线 原理

原理 一句话描述:register会把当前类中匹配的方法,存入一个map,而post会根据实参去map查找进行反射调用 撇开专业术语,其实EventBus就是在内部[存储]了一堆onEvent开头的方法,然后post的时候,根据post传入的[参数],去找到匹配的方法,[反射]调用之. 另外,它内部使用了[Map]进行存储,[键就是参数的Class类型].知道是这个类型,那么你觉得根据post传入的参数进行查找还是个事么? 其实不用发布者,订阅者,事件,总线这几个词或许更好理解,以后大家问了Ev

EventBus 事件总线模式实例(发布/订阅事件)

在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 using System; namespace PurchaseDevices.Model.CommonModel{/// <summary>/// 事件传递参数/// </summary>/// <typeparam name="T"></typep

EventBus事件总线框架(发布者/订阅者模式,观察者模式)

一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. Intent进行组件间通信,广播方式. 二.单例比较好的写法: private static volatile EventBus defaultInstance; 构造函数应当是private,不应该是public 1 public static EventBus getDefault() { 2 if