EventBus使用的简单介绍
来源:互联网 发布:新页进销存软件免费版 编辑:程序博客网 时间:2024/05/16 09:56
写在前面
以前我们做组件间的消息分发更新,一般会采用观察者模式,或者接口数据回调的相关方式,但是这样的做法虽然可以解决我们的问题,但是组件之间的耦合相当严重,而且代码也不易阅读和维护,为了解决这样的问题,我们可以使用消息总线EventBus框架。
EventBus是一款针对Android优化的发布/订阅事件总线,主要特点如下:替代Intent,Handler,broadcast在Fragment,Activity,Service,线程之间传递消息,开销小,代码优雅,以及将发送者和接受者解耦。
开源地址:https://github.com/greenrobot/EventBus
EventBus简单使用方式(官网给的3步走,我这里细分了5步):
- 1、项目添加依赖,在项目中的build.gradle中加入以下代码:
compile 'org.greenrobot:eventbus:3.0.0'
- 2、定义消息事件对象
public class MessageEventOne { public final String message; public MessageEventOne(String message) { this.message = message; }}
- 3、订阅者注册到EventBUs以及配置事件接受方法
EventBus.getDefault().register(this);//Declare your subscribing method:@Subscribepublic void onEvent(AnyEventType event) {/* Do something */};
- 4、发布这发送消息
EventBus.getDefault().post(new MessageEventOne("Hello everyone!"));
- 5、反注册EventBus
//这个是官网给的反注册在stop方法中@Overridepublic void onStop() { EventBus.getDefault().unregister(this); super.onStop();}//根据自己的需要,这里我的这个demo中使用的是 @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
好了,既然有了以上的五步实现方式,那么我们就简单的实现以下吧:
在这里首先提示一点,如下图:
看下代码MainActivity.java:
package com.example.eventbusdemo;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.Toast;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import org.greenrobot.eventbus.ThreadMode;//import de.greenrobot.event.EventBus;public class MainActivity extends AppCompatActivity { private Button mButton1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this); setContentView(R.layout.activity_main); initViews(); } private void initViews() { mButton1 = (Button) findViewById(R.id.button1); mButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MainActivity.this, Main2Activity.class)); } }); } /*@Subscribe public void onMessageEvent(MessageEventOne event) { Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show(); }*/ /** * 该方法会在UI线程中运行,接受事件同时会在UI线程中运行,这样我们可以在改方法中直接更新UI * * @param event */ @Subscribe @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(MessageEventOne event) { Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show(); }/* @Override protected void onStop() { super.onStop(); EventBus.getDefault().unregister(this); }*/ @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }}
Main2Activity.java:
package com.example.eventbusdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Button;import org.greenrobot.eventbus.EventBus;//import de.greenrobot.event.EventBus;public class Main2Activity extends AppCompatActivity { private Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initialize(); } private void initialize() { button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("wuyinlei", "Main2Activity当前线程" + Thread.currentThread()+toString()); EventBus.getDefault().post(new MessageEventOne("Hello everyone!")); Main2Activity.this.finish(); } }); }}
布局代码就更简单了,就有一个button,在这里就不多说了
我们直接看下结果吧:
使用是不是很简单哈,接下来我们来看下EventBus里面的几个ThreadMode:
POSTING PostThread :默认的 ThreadMode,表示在执行 Post 操作的线程直接调用订阅者的事件响应方法, 不论该线程是否为主线程(UI 线程)。当该线程为主线程时,响应方法中不能有耗时操作, 否则有卡主线程的风险。适用场景: 对于是否在主线程执行无要求,但若 Post 线程为主线程, 不能耗时的操作 ; MAIN MainThread :在主线程中执行响应方法。如果发布线程就是主线程,则直接调用订阅者的事件响应方法, 否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。显然, MainThread 类的方法也不能有耗时操作,以避免卡主线程。适用场景: 必须在主线程执行的操作 ; BACKGROUND BackgroundThread :在后台线程中执行响应方法。如果发布线程 不是 主线程,则直接调用订阅者的 事件响应函数,否则启动 唯一的 后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候, 它们会被放在队列中依次执行,因此该类响应方法虽然没有 PostThread 类和 MainThread 类方法 对性能敏感,但最好不要有重度耗时的操作或太频繁的轻度耗时操作,以造成其他操作等待。适用场景: 操作轻微耗时且不会过于频繁 ,即一般的耗时操作都可以放在这里; ASYNC Async :不论发布线程是否为主线程,都使用一个空闲线程来处理。和 BackgroundThread 不同的是 , Async 类的所有线程是相互独立的,因此不会出现卡线程的问题。适用场景: 长耗时操作, 例如网络访问 。
我也试过了,只要指定ThreadMode,方法名字可以自己定义的,下面我们来看下怎么使用吧。
我们首先来看下怎么区分是谁发送的消息,这个时候我们在定义一个消息事件对象:
public class MessageEventTwo { public final String message; public MessageEventTwo(String message) { this.message = message; }}
我们在Main2Activity中加入一个button,来测试一下:
button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new MessageEventTwo("我是第二个消息")); Main2Activity.this.finish(); } });
我们来看下运行结果:
可以看到,消息传递是不会混乱的,为什么呢,因为我们在接受消息的时候,已经指定了消息事件
@Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(MessageEventOne event) { Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(MessageEventTwo event) { Toast.makeText(this, "接收到消息:" + event.message, Toast.LENGTH_SHORT).show(); }
在这里说一点,如果没有在接受消息方法上指定,那就是默认的模式,就是在post消息的线程中处理(我刚开始没有指定,测试其他几个的时候,都是在post线程中,找了好久也不知道,最后看了源码知道了这几个模式 )
@Subscribe(threadMode = ThreadMode.MAIN)还有其他的模式
好了,我们来看下其他几种模式:
/** * 使用该方法作为订阅函数表示post消息事件和接受消息事件在同一个线程中 * * @param event */ @Subscribe(threadMode = ThreadMode.POSTING) public void onEvent(MessageEventOne event) { Log.d("wuyinlei", "onEvent当前线程" + Thread.currentThread() + toString()); //Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show(); } /** * 使用该方法,如果事件在UI线程中发出来,该方法会在子线程中执行,如果是从子线程中发出来消息,该方法会在子线程中执行 * * @param event */ @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onEventBackgroundThread(MessageEventOne event) { Log.d("wuyinlei", "onEventBackgroundThread当前线程" + Thread.currentThread() + toString()); // Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show(); } /** * 使用该方法,会在创建新的子线程中执行 * * @param event */ @Subscribe(threadMode = ThreadMode.ASYNC) public void Async(MessageEventOne event) { Log.d("wuyinlei", "onEventAsync当前线程" + Thread.currentThread() + toString()); // Toast.makeText(this, "接收到消息onEvent:" + event.message, Toast.LENGTH_SHORT).show(); }
我们来看下log打印吧:
好了,如果想要了解的更多,可以去看下源码哈,如果有问题或者疑问或者见解,可以QQ:1069584784
- EventBus使用的简单介绍
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus 的简单使用
- EventBus的简单使用
- EventBus的简单使用
- EventBus 《二》 Android EventBus的简单使用
- EventBus的初级使用介绍
- Android--EventBus的使用介绍
- EventBus框架的简单使用
- Android EventBus的简单使用
- 写在2016年上班第一天
- 函数书写的规则
- 乌克兰BlackEnergy新动向:通过Word文档进行APT攻击
- H.264语法分析
- windbg在DriverEntry下断点
- EventBus使用的简单介绍
- A的href和onclick
- iOS笔试题五
- 利用python抓取京东的数据
- oracle14连接NL Exception was generated异常问题
- express中文文档
- Android 小知识记录
- C# 线程同步示例
- 支撑微博千亿调用的轻量级RPC框架:Motan