# EventBusDemo **Repository Path**: LiuLinXi/EventBusDemo ## Basic Information - **Project Name**: EventBusDemo - **Description**: EventBus简单使用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-04-17 - **Last Updated**: 2021-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EventBusDemo #### 介绍 EventBus简单使用 EventBusDemo GitHub地址:https://github.com/greenrobot/EventBus 使用步骤 - 引入依赖 implementation 'org.greenrobot:eventbus:3.1.1' - 定义事件 public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } } - 准备订阅者 订阅者实现事件处理方法(也称为“订阅者方法”),这些方法将在发布事件时调用。这些是使用@Subscribe注释定义的。 请注意,使用EventBus 3时,可以自由选择方法名称(没有像EventBus 2中那样的命名约定)。 // This method will be called when a MessageEvent is posted (in the UI thread for Toast) @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); } // This method will be called when a SomeOtherEvent is posted @Subscribe public void handleSomethingElse(SomeOtherEvent event) { doSomethingWith(event); } 用户也需要注册自己和注销从总线。订阅者注册时,他们才会收到活动 Android生命周期注册、注销。 @Override public void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override public void onStop() { EventBus.getDefault().unregister(this); super.onStop(); } - 发布消息 从代码的任何部分发布事件。所有与该事件类型匹配的当前注册订阅者都将收到它。 EventBus.getDefault().post(new MessageEvent("Hello everyone!")); 线程模式 链接:https://www.jianshu.com/p/a040955194fc @Subscribe(threadMode = ThreadMode.MAIN) - ThreadMode.MAIN:表示无论事件是在哪个线程发布出来的,该事件订阅方法的onEvent都会在UI线程中执行,这个在安卓中是非常有用的,因为在Android的中只能在UI线程中更新UI,所有在此模式下的方法是不能执行耗时操作的。 - ThreadMode.POSTING:表示事件在哪个线程中发布出来的,事件订阅函数的onEvent就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程使用这个方法时,在的onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。 - ThreadMode.BACKGROUND:表示如果事件在UI线程中发布出来的,那么订阅函数的onEvent就会在子线程中运行,如果事件本来就是在子线程中发布出来的,那么订阅函数直接在该子线程中执行。 - ThreadMode.AYSNC:使用这个模式的订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程来执行订阅函数。 实际使用 简单使用1 package com.example.eventbusdemo; /** * @author wdl */ public class MessageEvent { private String message; /** * 当有多个注册消息时可以通过增加消息类型来辨别 */ private int messageType; public MessageEvent(String message,int messageType) { this.message = message; this.messageType=messageType; } public String getMessage() { return message; } public int getMessageType() { return messageType; } } public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView tvShowEvent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnToSecondActivity = findViewById(R.id.btn_second_activity); btnToSecondActivity.setOnClickListener(this); tvShowEvent = findViewById(R.id.tv_event); //1.注册 EventBus.getDefault().register(this); } /** * 2.订阅者 */ @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { String msg = event.getMessage(); int messageType = event.getMessageType(); Toast.makeText(MainActivity.this, messageType + ":" + msg, Toast.LENGTH_SHORT).show(); if (messageType == 0) { tvShowEvent.setText(msg); } } @Override public void onClick(View v) { if (v.getId() == R.id.btn_second_activity) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } } @Override protected void onDestroy() { super.onDestroy(); //3.注销 EventBus.getDefault().unregister(this); } } public class SecondActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btnSendMessage = findViewById(R.id.btn_send_message); btnSendMessage.setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_send_message) { new Thread(new Runnable() { @Override public void run() { //4.发送事件 EventBus.getDefault().post(new MessageEvent("你好MainActivity", 0)); } }).start(); } } } 简单使用2 /** * 多种订阅类型 */ @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMain(FirstEvent event) { String msg = event.getMessgae(); Log.d("EventTAG", "onEventMain: " + event.getMessgae()); } @Subscribe(threadMode = ThreadMode.POSTING) public void onEventPosting(SecondEvent event) { String msg = event.getMessage(); Log.d("EventTAG", "onEventPosting: " + msg); } @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onEventBackground(ThirdEvent event) { String msg = event.getMessage(); Log.d("EventTAG", "onEventBackgroud: " + msg); } @Subscribe(threadMode = ThreadMode.ASYNC) public void onEventAsync(FourthEvent event) { String msg = event.getMessage(); Log.d("EventTAG", "onEventAsync: " + msg); } public class SecondActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btnSendMessage = findViewById(R.id.btn_send_message); Button btnPost1 = findViewById(R.id.btn_post_1); Button btnPost2 = findViewById(R.id.btn_post_2); Button btnPost3 = findViewById(R.id.btn_post_3); Button btnPost4 = findViewById(R.id.btn_post_4); btnSendMessage.setOnClickListener(this); btnPost1.setOnClickListener(this); btnPost2.setOnClickListener(this); btnPost3.setOnClickListener(this); btnPost4.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_send_message: new Thread(new Runnable() { @Override public void run() { //4.发送事件 EventBus.getDefault().post(new MessageEvent("你好MainActivity", 0)); } }).start(); break; case R.id.btn_post_1: EventBus.getDefault().post(new FirstEvent("FirstEvent")); break; case R.id.btn_post_2: EventBus.getDefault().post(new SecondEvent("SecondEvent")); break; case R.id.btn_post_3: EventBus.getDefault().post(new ThirdEvent("ThirdEvent")); break; case R.id.btn_post_4: EventBus.getDefault().post(new FourthEvent("FourthEvent")); break; default: } } } - tips:订阅函数的执行是根据参数中的事件类的类名来决定的