EventBus3.0的使用

来源:互联网 发布:山东税务软件下载 编辑:程序博客网 时间:2024/05/06 14:28

EventBus是Android的发布/订阅事件总线优化。主要功能是替代在Android四大组件Activity,Service,Intent,Handler,BroadCast线程之间传递消息,优点是开销小,代码更优雅。以及将发送者和接收者解耦。

1.EventBus3.0的特点:

  1. 简化了组件之间的通信
  2. 将事件发送方和接收方执行与Activities, Fragments和后台线程,避免了复杂的和容易出错的依赖性和生命周期问题
  3. 包的体积很小(~ 50 k jar),
  4. 、拥有先进的功能,如交付线程,用户优先级等。

2.EventBus3.0的下载地址:

https://github.com/greenrobot/EventBus

3.EventBus3.0的基本使用

在EventBus中,获取实例的方法一般是采用EventBus.getDefault()来获取默认的EventBus实例。
EventBus mEventBus = Event.getDefault();

(3.1)自定义一个类,可以是空类,比如:

public class SimpleEventType {
public SimpleEventType(){}
}

(3.2)在要接收消息的页面注册:

mEventBus.register(this);

(3.3)发送消息

mEventBus.post(new SimpleEventType event);

(3.4)接受消息的页面实现(共有四个枚举类型注解,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个在主线程的):

@Subscribe(threadMode = ThreadMode.MAIN)//在主线程
public void onEvent(SimpleEventType event) {}

(3.5)解除注册

mEventBus.unregister(this);

EventBus的执行顺序就是这样的。

下面是一个EventBus使用的简单例子:

描述:点击一个Button跳转界面。第二个页面的button点击后向第一个界面发送消息,第一个界面更新text值。

案例的代码:
package com.lidong.demo.eventbus.event;

/** * Created by lidong on 2016/3/21. */public class SimpleEvent {private String mMsg;public SimpleEvent(String msg) {mMsg = msg;}public String getMsg(){return mMsg;}}`package com.lidong.demo.eventbus;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import com.lidong.demo.R;import com.lidong.demo.eventbus.event.SimpleEvent;import org.greenrobot.eventbus.EventBus;import org.greenrobot.eventbus.Subscribe;import butterknife.Bind;import butterknife.ButterKnife;import butterknife.OnClick;public class EventBusDemo1Activity extends AppCompatActivity {@Bind(R.id.toolbar)Toolbar toolbar;@Bind(R.id.btn_open_page1)Button btnOpenPage1;@Bind(R.id.tv_display)TextView tvDisplay;private String TAG = EventBusDemo1Activity.class.getSimpleName();@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_event_bus_demo1);    ButterKnife.bind(this);    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);    setSupportActionBar(toolbar);    ButterKnife.bind(this);    //注册EventBus    EventBus.getDefault().register(this);}@OnClick({R.id.btn_open_page1})public void onClick(View v){    switch (v.getId()){        case R.id.btn_open_page1:            startActivity(new Intent(EventBusDemo1Activity.this,EventBusDemo2Activity.class));            break;    }}@Subscribe()public void onEventMainThread(SimpleEvent event) {    String msg = "onEventMainThread收到了消息:" + event.getMsg();    Log.d(TAG, msg);    tvDisplay.setText(msg);    Toast.makeText(this, msg, Toast.LENGTH_LONG).show();}@Overrideprotected void onDestroy(){    super.onDestroy();    EventBus.getDefault().unregister(this);//解除EventBus}}

`

`

package com.lidong.demo.eventbus;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.View;import android.widget.Button;import com.lidong.demo.R;import com.lidong.demo.eventbus.event.SimpleEvent;import org.greenrobot.eventbus.EventBus;import butterknife.Bind;import butterknife.ButterKnife;import butterknife.OnClick;public class EventBusDemo2Activity extends AppCompatActivity {@Bind(R.id.toolbar)Toolbar toolbar;@Bind(R.id.btn_click_send_message)Button btnClickSendMessage;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_event_bus_demo2);    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);    setSupportActionBar(toolbar);    ButterKnife.bind(this);}@OnClick({R.id.btn_click_send_message})public void onClick(View v){    switch (v.getId()){        case R.id.btn_click_send_message:            EventBus.getDefault().post(                    new SimpleEvent("你好,EventBus!"));            break;    }}}

`
就这两个重要的类,就已经实现了界面之间的通信。

EventBus的消息发送

` EventBus.getDefault().post(                    new SimpleEvent("你好,EventBus!"));`

EventBus的消息接收

在EventBus中使用中,假如有三个事件发送到一个页面,如何接收呢?则是通过事件的实例来区别的。
public class SimpleEvent1 {

private String mMsg;public SimpleEvent1(String msg) {mMsg = msg;}public String getMsg(){return mMsg;}}public class SimpleEvent2 {private String mMsg;public SimpleEvent2(String msg) {mMsg = msg;}public String getMsg(){return mMsg;}}public class SimpleEvent3 {private String mMsg;public SimpleEvent3(String msg) {mMsg = msg;}public String getMsg(){return mMsg;}}EventBus.getDefault().post(new SimpleEvent1("你好,EventBus1!"));break;   EventBus.getDefault().post(new SimpleEvent2("你好,EventBus2!"));break;   EventBus.getDefault().post(new SimpleEvent3("你好,EventBus3!"));break;

四种不同优先级的事件处理(注解)

@Subscribe(threadMode = ThreadMode.MAIN)//在主线程public void onEventUse(SimpleEvent event) {    Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg());}@Subscribe(threadMode = ThreadMode.MAIN)//在主线程public void onEventUse(SimpleEvent2 event) {    Log.d(TAG, "onEventMainThread收到了消息:" + event.getMsg());}@Subscribe(threadMode = ThreadMode.BACKGROUND)//在后台线程public void onEventUse(SimpleEvent3 event){    Log.d(TAG, "onEventBackground收到了消息:" + event.getMsg());}@Subscribe(threadMode = ThreadMode.ASYNC)//强制在后台线程执行public void onEventUseAsync(SimpleEvent2 event){    Log.d(TAG, "onEventAsync收到了消息:" + event.getMsg());}@Subscribe(threadMode = ThreadMode.POSTING)//默认方式, 在发送线程执行public void onEventUser(SimpleEvent3 event) {    Log.d(TAG, "OnEvent收到了消息:" + event.getMsg());}

也就是这样,要说明的问题是消息接收的参数是由事件的实例来决定的。

代码地址

来张图

1 0
原创粉丝点击