• Android EventBus 事件订阅/发布框架


    EventBus 概述

    一套 Android Java 事件订阅 / 发布框架,由 greenrobot 团队开源。

    作用:在组件 / 线程间通信的场景中,将数据或事件传递给对应的订阅者
    在这里插入图片描述
    使用原因:EventBus比传统的接口监听、Handler、LocalBroadcastManager更简单可靠。
    优点:
    1.使用事件总线框架,实现事件发布者与订阅者松耦合。
    2.提供透明线程间通信,隐藏了发布线程与订阅线程间的线程切换。

    角色分工

    三个角色
    Event:事件,它可以是任意类型,EventBus会根据事件类型进行全局的通知。
    Subscriber:事件订阅者,在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe,并且指定线程模型,默认是POSTING。
    Publisher:事件的发布者,可以在任意线程里发布事件。一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

    订阅者注解特性

    在这里插入图片描述
    在这里插入图片描述

    Demo

    下面用一个简单的例子介绍一下EventBus的使用,这个例子实现的功能是:有界面1、界面2、两个界面,界面1跳转到界面2,界面2返回界面1时,带回一个参数,并且在界面1中以Toast方式展现。

    1.引入依赖
    引入 implementation ‘org.greenrobot:eventbus:3.1.1’
    在这里插入图片描述
    2.由目标可得出SecondActivity是事件发布,MainActivity是事件订阅

    public class MainActivity extends AppCompatActivity {
    
        private Button button;
        private TextView textView;
    
        @Subscribe
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //注册MainActivity为订阅者
            EventBus.getDefault().register(this);
    
            button = findViewById(R.id.button1);
            textView = findViewById(R.id.tv_maintext);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void onEventMainThread(FirstEvent event) {
            Toast.makeText(this, event.getStrMsg(),Toast.LENGTH_LONG).show();
        }
        
        @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
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    public class SecondActivity extends AppCompatActivity {
    
        private Button btn_second;
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
            btn_second = findViewById(R.id.btn_second);
    
            btn_second.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    EventBus.getDefault().post(new FirstEvent("我只有感叹号!!!"));
                    finish();
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    两个xml文件分别如下:

    
    
    
        
    
        
    
    
    
        

    定义事件:定义一个事件的封装对象。在程序内部就使用该对象作为通信的信息:

    public class FirstEvent {
        private String strMsg;
    
        public FirstEvent(String strMsg) {
            this.strMsg = strMsg;
        }
    
        public String getStrMsg() {
            return strMsg;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    Flutter中的多线程如何使用
    分布式任务调度框架XXL-JOB
    贪吃蛇小游戏代码
    Netbeans介绍
    【Java】增强for循环
    四川羌族文化展览网站界面设计与实现(html前端设计)
    Python---死循环概念---while True
    ​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​
    Virtio Over MMIO
    L1-023 输出GPLT C++解法【全网最细讲解】
  • 原文地址:https://blog.csdn.net/Hedenghui777/article/details/126169076