开源框架EventBus(一)

                                    开源框架EventBus(一)

1 什么事EventBus 

      EventBus是一个android事件发布/订阅的高性能框架,主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。 优点是开销小,代码更简洁优雅,事件发布者和事件接收者之间的耦合度更小。如果您目前的项目的逻辑非常复杂,例如组件、线程之间大量 传参, 频繁使用 广播的话 维护起来比较吃力的话,或许EventBus是一个非常好的选择。

2 优点

  • 可以简化android组件(activity、service、broadcast)以及后台线程之间的通讯
  • 减少事件发布者和接收者之间的耦合度
  • 可以避免使用复杂的逻辑、减少事件发送者和接收者之间易错的依赖,避免由于组件生命周期带来的一系列问题
  •  使用非常简单
  • 效率非常高
  • 轻量级(jar小于50k)
  • 目前有1000W的app在使用
  • 先进的功能例如:线程调度,支持事件接收的优先级等

3 EventBus实战

3.1 定义一个事件类

package com.sohu.eventbustest;
/**
 * Created by yuliu207272 on 2015/5/15.
 */
public class MessageEvent {
    private String msg;
    public MessageEvent(String msg) {
        this.msg = msg;
    }
    public String getMsg(){
        return msg;
    }
}
 

3.2 在activity中的onCreate()方法中注册事件

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

3.3 定义接收消息的方法

  public void onEvent(MessageEvent event){
        String msg = event.getMsg();
        tvText.setText(msg);
        Log.e(Tag, msg);
    }
 查阅EventBus官方文档可知
       接收事件规定有4种
       onEvent  使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行 也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作 如果执行 耗时操作容易导致事件分发延迟。声明下,app中所有的Activity都是在主线程中绘制的。
     onEventMainThread 使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的 onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行 这个在Android中是非常有用的, 因为在Android中只能在UI线程中跟新UI, 所以在onEvnetMainThread方法中是不能执行耗时操作的。
       onEventBackgroundThread: 使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的 那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的, 那么onEventBackground 函数直接在该子线程中执行。
      onEventAsync: 使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行
mainActivity:
public class SendMessageActivity extends Activity {
    private EditText etText;
    private Button btnSend;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_message);
        etText = (EditText)findViewById(R.id.et_text);
        btnSend = (Button)findViewById(R.id.btn_send);
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!TextUtils.isEmpty(etText.getText())){
                    String sendMessage = etText.getText().toString();
                    EventBus.getDefault().post(new MessageEvent(sendMessage));
                }
            }
        });
    }
}
注意: 方法中接收的MessageEvent和后面post方法中MessageEvent必须要是一种类型才能接收到消息

3.4 发送消息

    再新建一个 SendMessageActivity,里面一个输入框输入要发送的消息,点击发送后,MainActivity就会收到消息了。
SendMessageActivity:
public class SendMessageActivity extends Activity {
    private EditText etText;
    private Button btnSend;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_message);
        etText = (EditText)findViewById(R.id.et_text);
        btnSend = (Button)findViewById(R.id.btn_send);
        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!TextUtils.isEmpty(etText.getText())){
                    String sendMessage = etText.getText().toString();
                    EventBus.getDefault().post(new MessageEvent(sendMessage));
                }
            }
        });
    }
}
 
布局文件:
<LinearLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.sohu.eventbustest.SendMessageActivity">
  <EditText
      android:id="@+id/et_text"
      android:layout_width="fill_parent"
      android:layout_height="60dip" />
    <Button
        android:gravity="center"
        android:textSize="18sp"
        android:textColor="#000000"
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="60dip"
        android:text="发送消息"/>
</LinearLayout>

3.4 测试结果

    在SendMessageActivity中的EditText中输入: eventBus message from MrLiu,点击发送后,按返回键,在 MainActivity查看

猜你喜欢

转载自1029457926.iteye.com/blog/2211819