EventBus 基本使用

EventBus 是greenrobot 的一个事件通讯框架。其使用方式与Handler类似,但更加强大。 
有如下特点:

  • 简化了组件之间的通讯
    • 将事件分为发送方和接受方
    • 可以在Activity、Fragment、子线程间使用
    • 避免了复杂的生命周期和依赖性问题
  • 快速,专为高性能优化
  • 具有交付线程,用户优先级设定等功能
  • 体积小

其他特性:

  • 使用注解方式(3.0)
  • 可以在主线程发布接受事件
  • 直接将方法交付至后台线程
  • 可以在代码中任何地方使用

EventBus使用

首先将EventBus导入

compile 'org.greenrobot:eventbus:3.0.0'  

首先创建一个消息的实体类,类似Message类,但可以自由指定属性以及方法:

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

注册观察者(接收者)通常在主线程的onCreate()中:

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //注册EventBus
    //EventBus可以通过`new()`方法获得或通过默认方法
    EventBus.getDefault().register(this);
  }

对应的取消注册

  @Override
  protected void onDestroy()
  {
    //取消注册EventBus
    EventBus.getDefault().unregister(this);
    super.onDestroy();
  }

注解订阅方法:

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(Msg msg){
        //此方法运行至主线程
        String msgs =  msg.getMsg();
    }

其中threadMode有四个值

  • ThreadMode.MAIN:运行在主线程
  • ThreadMode.POSTING:在那个线程发布的就在那个线程运行
  • ThreadMode.ASYNC:将事件运行在子线程
  • ThreadMode.BACKGROUND:如果在UI线程发布就运行在新创建的子线程中,如果是子线程发布就运行在当前子线程。

发送消息方法:

EventBus.getDefault().post(new Msg("message"));  

在注册方法执行后,EventBus将便利类中所有带有注解的方法。在发送后通过方法的参数判断具体方法并执行。

小例子: 在子线程发送在主线程更新UI

package cn.mdd.shopapp.activity;

import android.os.SystemClock;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.TextView;  
import android.widget.Toast;

import org.greenrobot.eventbus.EventBus;  
import org.greenrobot.eventbus.Subscribe;  
import org.greenrobot.eventbus.ThreadMode;

import cn.mdd.shopapp.R;  
import cn.mdd.shopapp.activity.entity.Msg;

public class CommodityClassifyActivity extends AppCompatActivity {

    TextView textView;
    EventBus eventBus;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_commodity_classify);
        textView = (TextView) findViewById(R.id.textView2);
        eventBus = new EventBus();
    }

    @Override
    protected void onStart() {
        super.onStart();
        eventBus.register(this);
    }

    @Override
    protected void onStop() {
        eventBus.unregister(this);
        super.onStop();
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMsg(Msg msg) {
        textView.setText(msg.getMsg());
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(Msg msg){
        String msgs =  msg.getMsg();
    }

    public void doClick(View view) {
        new Thread(){
            @Override
            public void run() {
                for (int i = 0;i<100;i++) {
                    eventBus.post(new Msg(""+i));
                    SystemClock.sleep(1000);
                }
            }
        }.start();
    }
}
posted @ 2017-05-02 11:10  天涯海角路  阅读(167)  评论(0)    收藏  举报