EventBus使用记录(一)

原创 2017年03月08日 16:48:49

摘要:EventBus是在看一个开源项目时,偶然之间看到这个框架,不认识,遂学习之,并记录下来。

概述

EventBus 是一个事件发布和订阅的轻量级框架。通过解耦发布者和订阅者简化Android事件传递 。可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法,代码简洁明了。

导入方式

compile ‘org.greenrobot:eventbus:3.0.0’

常用方法

1、定义事件类型(此处为一个自定义类)

public class FirstMessageEvent  {
    private String msg;
    public FirstMessageEvent(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
}

2、订阅者注册及解绑

 //注册
 EventBus.getDefault().register(this); 
 //解绑
 EventBus.getDefault().unregister(this);

3、订阅者接收事件

//org.greenrobot:eventbus:3.0.0 已改为自定义接收事件方法

@Subscribe(threadMode = ThreadMode.POSTING)   
public void onMyEvent(MessageEvent event) {  
     String msg = "收到:" + event.getMsg();
     Log.d("recive msg", msg);
} 

4、发送者发送事件

 EventBus.getDefault().post( new FirstMessageEvent("send msg"));

下面先来个简单例子,这个例子,作为替换线程调用Handle实现刷新界面,来熟悉EventBus操作。

一个简单示例

1、创建activity
- xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="orderandcasher.langge.com.ormlitetext.MainActivity">
    <Button
        android:id="@+id/btn_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="启动线程发送消息"
        />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示"
        android:layout_centerInParent="true"/>
</RelativeLayout>
  • java文件
public class MainActivity extends AppCompatActivity {

    private Button button_1;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView)findViewById(R.id.text);
        button_1 = (Button)findViewById(R.id.btn_1);

        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

    }

}

2、创建事件类
简单构造一个数据结构

public class FirstMessageEvent  {
    private String msg;
    public FirstMessageEvent(String msg) {
        this.msg = msg;
    }
    public String getMsg() {
        return msg;
    }
}

3、订阅者注册和解绑

@Override  
public void onStart() {  
    super.onStart();  
    EventBus.getDefault().register(this);  
}  

@Override  
public void onStop() {  
    EventBus.getDefault().unregister(this);  
    super.onStop();  
}  

也可以在onCreate中注册,在onDestroy解绑,看情况而定。

4、订阅者自定义函数接收事件

    //接收事件,UI线程执行
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMyEvent(FirstMessageEvent event){
        String msg = "在UI主线程中收到消息:" + event.getMsg();
        Log.d("recive msg", msg);
        textView.setText(msg);
        Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show();
    }

EventBus 包含4个ThreadMode:
- ThreadMode.POSTING:默认使用该模式,表示该方法会在当前发布事件的线程执行
- ThreadMode.MAIN:表示会在UI线程中执行
- ThreadMode.BACKGROUND:若当前线程非UI线程则在当前线程中执行,否则加入后台任务队列,使用线程池调用
- ThreadMode.ASYNC:加入后台任务队列,使用线程池调用

5、发送者发送事件

button_1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          //开启线程发送事件
          new Thread(new Runnable() {
              @Override
              public void run() {                  
                  EventBus.getDefault().post(
                  new FirstMessageEvent("骚年,给我刷新显示内容吧"+
                          new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
                          Locale.getDefault()).format(new Date()) ) );
              }
          }).start();
      }
  });

完整activity代码:

public class MainActivity extends AppCompatActivity {

    private Button button_1;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this);//注册

        textView = (TextView)findViewById(R.id.text);
        button_1 = (Button)findViewById(R.id.btn_1);

        button_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //开启线程发送事件
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //send event
                        EventBus.getDefault().post( 
                        new FirstMessageEvent("骚年,给我刷新显示内容吧"+
                                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", 
                                Locale.getDefault()).format(new Date()) ) );
                    }
                }).start();
            }
        });

    }

    //接收事件,当前发布事件的线程执行
/*    @Subscribe
    public void onEventThread(FirstMessageEvent event) {

        String msg = "在发送者的线程中收到消息:" + event.getMsg();
        Log.d("recive msg", msg);
        textView.setText(msg); // 非ui线程不能操作控件

    }*/
     //接收事件,UI线程执行
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMyEvent(FirstMessageEvent event){
        String msg = "在UI主线程中收到消息:" + event.getMsg();
        Log.d("recive msg", msg);
        textView.setText(msg);
        Toast.makeText(getApplicationContext(), "lala:"+msg, Toast.LENGTH_SHORT).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);//解绑
    }
}

参考

想了解EventBus,下面2篇文章真的很不错,强烈推荐
1、http://blog.csdn.net/harvic880925/article/details/40660137
2、http://blog.csdn.net/wl1769127285/article/details/51065015
3、EventBus Github源码

相关文章推荐

EventBus使用记录demo

  • 2016年03月31日 15:26
  • 7.54MB
  • 下载

EventBus 3使用记录demo

  • 2016年03月31日 16:43
  • 7.56MB
  • 下载

EventBus学习记录

EventBus及其使用

eventBus使用Demo

  • 2015年11月24日 11:47
  • 3.91MB
  • 下载

EventBus的详细使用

  • 2016年03月17日 11:15
  • 6.73MB
  • 下载

EventBus3.0,使用过程中所有的梗。

说到EventBus,想必大家都不陌生,咦~~~~你没听过,好吧,你还要认真学习啊,这篇博客不是去分析EventBus的源码的,也不是讲什么人生哲理,就是教大家如何使用这么一个神器,以后谁要是问你Ev...

EventBus使用简单示例

  • 2015年09月17日 10:48
  • 5.99MB
  • 下载

EventBus的简单使用

  • 2015年09月17日 16:15
  • 1.38MB
  • 下载

学习EventBus3的使用

前言 EventBus是greenrobot在Android平台发布的一款以订阅——发布模式为核心的开源库。EventBus翻译过来是事件总线的意思,可以这样理解:一个个事件(event)发送到...

EventBus的使用

  • 2016年10月26日 14:14
  • 2.74MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EventBus使用记录(一)
举报原因:
原因补充:

(最多只允许输入30个字)