zoukankan      html  css  js  c++  java
  • 事件总线EventBus

    什么是事件总线管理?

    1. 将事件放到队列里,用于管理和分发;
    2. 保证应用的各个部分之间高效的通信及数据,事件分发;
    3. 模块间解耦;

    什么是EventBus?

    1. EventBus是发布/订阅的事件总线。EventBus模式-也被称为MessageBus或者发布者/订阅者(publisher/subcriber)模式——可以让两个组件相互通信,但是他们之间并不相互知晓。
    2. 基于事件总线管理/订阅/分发模式的。事件响应有更多的线程选择,EventBus可以向不同的线程中发布事件。EventBus支持Sticky Event。
    3. 使用时需要先注册订阅,然后向订阅者分发消息数据即可。包含4个成分:发布者,订阅者,事件,总线。订阅者可以订阅多个事件,发布者可以发布任何事件,发布者同时可以也是订阅者。分订阅、注册、发布、取消注册等步骤。

      如下图:
      这里写图片描述

     EventBus.getDefault().register(this);   //注册事件
     EventBus.getDefault().post(object);     //发送事件
     EventBus.getDefault().unregister(this); //取消事件 
    

    //订阅处理事件的方法和区别

    //UI线程执行
    public void onEventMainThread() {}
    //当前发布事件的线程执行
    public void onEventPostThread() {}
    //如果当前非UI线程,则直接调用;如果是UI线程,则将任务加入到后台的一个队列
    public void onEventBackgroundThread() {}
     //加入后台任务队列,使用线程池调用
    public void onEventAsyncThread() {}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    取消注册:

    EventBus.getDefault().unregister(this);
    
    • 1

    写个例子:单击一个按钮发送消息,事件在哪里注册了,就在哪里接收:

    首先在build.gradle里加入一个依赖库:compile ‘org.greenrobot:eventbus:3.0.0’

    package com.example.zhiwenyan.eventbus;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    
    public class MainActivity extends AppCompatActivity {
        private Button btn;
        private TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            EventBus.getDefault().register(this);  //注册事件
            btn = (Button) findViewById(R.id.button);
            textView = (TextView)findViewById(R.id.textView);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    MyEvent myEvent = new MyEvent();
                    myEvent.setType("1");
                    myEvent.setContent("我是发送的内容");
                    //发送事件
                    EventBus.getDefault().post(myEvent);
                }
            });
        }
    
        //处理事件
        @Subscribe
        public void onEventMainThread(MyEvent myEvent) {
            if (myEvent.getType().equals("1")) {
                textView.setText(myEvent.getContent());
            }
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //取消注册
            EventBus.getDefault().unregister(this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 2
    • 25

    在OnCreate()里注册了一个事件 EventBus.getDefault().register(this);this代表在当前的类注册,单击一个按钮时发布一个事件EventBus.getDefault().post(myEvent); myEvent事件类的MyEvent的对象。然后在UI线程执行处理了这个事件;最后在onDestory摧毁了这个事件

    事件类:

    public class MyEvent {
        private String type;
        private String content;
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    布局文件就不复制了:一个Button、一个TextView很简单;

    事件分发总库EventBus,小编正在学习这个,写一篇博客,帮助大家入门一下;小编认为学习这个,先把流程搞明白,然后在再去理解,多写几个例子(比如在Fragment之间传递信息,后台到前台传递消息等等),最后呢可以深入的研究一下里面的源码(正在研究中….);

    大家也可以在github上去看一下:https://github.com/greenrobot/EventBus

  • 相关阅读:
    Java 源码刨析
    qemu-guest-agent详解
    Java 源码刨析
    NTP服务解析
    virsh常见命令笔记
    Ansible之playbook
    ansible模块详解
    HashMap详解
    Mysql-Incorrect string value
    web开发中前后端传值
  • 原文地址:https://www.cnblogs.com/tiancai/p/7266889.html
Copyright © 2011-2022 走看看