EventBus的使用与原理 组件通信 线程通信(1)

开宗明义,这篇文章主要是介绍EventBus的使用与原理。循序渐进,第一篇讲使用,第二篇讲原理。

简介

  1. 首先,要知道Eventbus是什么?
    官网的定义是:EventBus is a publish/subscribe event bus optimized for Android.
    翻译过来就是:EventBus是一个为Android设计的,并且经过优化的发布/订阅事件总线。
    这么说不好理解,用白话说就是:Android组件间进行通信的工具、载体。比如Activity之间的通信,可以用原生的startActivityForResult,setResult方法,不过有些麻烦,如果用EventBus实现起来,就简单的多了。
  2. 下面说一说EventBus的优点吧:
    1. 简化组件间的通信,将程序员从冗杂的代码中解救就出来。
    2. 时代码代码更简洁,逻辑更清晰;
    3. 体积小(约50k),效率高;
    4. 多线程间通信;
    5. 易于学习。
      EventBus真的很好用,下面就给大家演示一下如何使用。

使用

  1. 在module级别的build.gradle文件中添加依赖:
    compile 'org.greenrobot:eventbus:3.0.0'
  2. 定义一个事件(Event),用于在组件间传递信息:

    class MainEvent {
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    }
  3. 订阅事件(接收事件):

    1. 首先在订阅事件的Activity或Fragment中注册和解除注册EventBus:

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          EventBus.getDefault().register(this);
      }
      @Override
      protected void onDestroy() {
          super.onDestroy();
          EventBus.getDefault().unregister(this);
      }
    2. 订阅事件

      @Subscribe
      public void handleEvent(MainEvent e) {
          tvName.setText(e.getName());
          tvAge.setText(e.getAge() + "");
      }
  4. 发送事件:

                MainEvent e = new MainEvent();
                e.setName(etName.getText().toString());
                e.setAge(Integer.parseInt(etAge.getText().toString()));
                EventBus.getDefault().post(e);
                finish();

这样,在发送完事件之后,就会执行handleEvent方法了。是不是很简单?Eventbus的用法基本就是这样,下面说一下EventBus的线程模式。

线程模式

  1. POSTING:处理事件的线程与发送事件的线程相同。就是说,在哪个线程发送事件,就在那个线程处理事件。这也是默认的线程模式。

    // Called in the same thread (default)
    // ThreadMode is optional here
    @Subscribe(threadMode = ThreadMode.POSTING)
    public void onMessage(MessageEvent event) {
        log(event.message);
    }
  2. MAIN: 无论在哪个线程发送事件,都在主线程处理事件,比如更新UI。

    // Called in Android UI's main thread
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessage(MessageEvent event) {
        textField.setText(event.message);
    }
  3. BACKGROUND:如果发送事件的线程是主线程,那么EventBus会新创建一个Background线程,来处理事件。如果发送事件的线程不是主线程,那么就在发送线程处理事件。比如执行耗时操作:网络请求,防止阻塞主线程。

    // Called in the background thread
    @Subscribe(threadMode = ThreadMode.BACKGROUND)
    public void onMessage(MessageEvent event){
    saveToDisk(event.message);
    }
  4. ASYNC:无论在哪个线程发送事件,都新创建一个线程(其实EventBus会维护一个ThreadPool,每次返回一个Thread)来处理事件。比如执行耗时操作:网络请求,防止阻塞主线程。

    // Called in a separate thread
    @Subscribe(threadMode = ThreadMode.ASYNC)
    public void onMessage(MessageEvent event){
        backend.send(event.message);
    }

    好的,基本用法就是这些,谢谢大家哦~~

你可能感兴趣的:(线程通信,组件通信,eventbus3-0)