EventBus使用记录(一)

摘要: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源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值