前言

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。我们今天就来学习一下它。

1.EventBus概述

EventBus原理图

Android事件总线之EventBus3.0基本使用_第1张图片

EventBus的四种ThreadMode(线程模型)

  ThreadMode.MAIN   表示这个方法在主(UI)线程中执行,不能做耗时操作,否则会ARN。

       ThreadMode.BACKGROUND 如果调用post方法的线程是子线程,则直接在该 线程执行,如果是主线程,则切换到后台执               行,不能做          并发处理。

       ThreadMode.ASYNC 无论消息在哪个线程发布,消息处理函数都会开辟新的独立线程,可以用来执行耗时操作。

       TheadMode.POSTING 消息处理函数与消息发送方在同一个线程执行。


2.下载地址:https://github.com/greenrobot/EventBus


2.EventBus的用法


    1.自定义发送消息类

    

public class MessageEvent {}

2.注册

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


3.发送消息

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


4.处理消息

@Subscribe(threadMode = ThreadMode.MAIN)    public void messageEventBus(MessageEvent messageEvent) {        tv_eventbus_result.setText(messageEvent.name);    }

处理事件方法名可以随意取名,但是必须加上@Subscribe,并指定线程模型


5.取消注册

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

3.EventBus实际应用

前面讲是EventBus的简介、原理和使用步骤,理论性比较强,接下来我们来写一个demo来实际应用一下吧


㈠ 首先添加依赖库

compile 'org.greenrobot:eventbus:3.0.0'

㈡创建消息事件类

/** * LiuW * Created by LiuW on 2017/6/27. *///创建发送消息类public class MessageEvent {   public String name;    public MessageEvent(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

㈢注册和取消

// eventbuspublic class EventBusActivity extends Activity {    private TextView tv_title;    private Button bt_eventbus_send;    private Button bt_eventbus_sticky;    private TextView tv_eventbus_result;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_event_bus);        initView();        initData();        initListener();    }    private void initData() {        tv_title.setText("EventBus");        //注册        EventBus.getDefault().register(EventBusActivity.this);    }    @Override    protected void onDestroy() {        super.onDestroy();        //解注册        EventBus.getDefault().unregister(EventBusActivity.this);    }

㈣ 消息处理

ThreadMode我这设置的是MAIN,事件会在UI线程中处理,这里用TextView显示事件传递的消息内容

@Subscribe(threadMode = ThreadMode.MAIN)    public void messageEventBus(MessageEvent messageEvent) {        tv_eventbus_result.setText(messageEvent.name);    }

㈤发布消息

public class EventBusSendActivity extends Activity {    private TextView tv_title;    private Button bt_eventbus_send_main;    private Button bt_eventbus_send_sticky;    private TextView tv_eventbus_send_result;    boolean isFirstFlag = true;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_event_bus_send);        initView();        initData();        initListener();    }    private void initListener() {        // 主线程发送数据按钮点击事件处理        bt_eventbus_send_main.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //发送消息                EventBus.getDefault().post(new MessageEvent("主线程发送来的数据"));                // 结束当前页面                finish();            }        });}

代码写好了,让我们看一下运行结果。

我来看一下首页显示效果如图

Android事件总线之EventBus3.0基本使用_第2张图片

点击“跳转到发送页面“按钮,进入发送消息页面,如图

Android事件总线之EventBus3.0基本使用_第3张图片

现在我们点击”主线程发送数据“按钮,当前页面被finish了,并返回到EventBus页面,EventBus页面显示了”主线程发送来的数据“

Android事件总线之EventBus3.0基本使用_第4张图片


   

更多相关文章

  1. 一篇文章带你了解 Android 消息机制的原理!
  2. Android Jni中使用线程及回调更新UI
  3. 如何在android的jni线程中实现回调
  4. Android TextView设置自动识别的超链接字体颜色,及自身点击事件无
  5. Android事件分发机制完全解析,带你从源码的角度彻底理解
  6. Android系列(一) 要了解的Android的消息机制
  7. 巧用布局文件实现Android中实现事件监听机制
  8. 一步步探索学习Android Touch事件分发传递机制(一)

随机推荐

  1. 《疯狂html5/css3/javascript讲义》这本
  2. 如果外部应用程序更改了持久模型(服务器
  3. 如何为给定的地方放置标记
  4. 如何在rails中使用ajax将数据从控制器传
  5. javascript对iframe的互操作浅析
  6. 使用ng-repeat渲染条件标记
  7. textarea高度自适应自动展开
  8. javascript encodeURIComponent并将空格
  9. 使用append方法将对象转换为字符串
  10. 什么“返回此”在javascript函数中做什么