您的位置:首页 > 移动开发 > Android开发

Android事件总线之EventBus3.0基本使用

2017-06-27 11:25 856 查看
前言

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

1.EventBus概述

EventBus原理图



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;
}
}


㈢注册和取消

// eventbus
public 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();
}
});
}

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

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



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



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




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息