• 【开源库推荐】#3 Android EventBus的使用 Stars


    原文地址:【开源库推荐】#3 Android EventBus的使用 | Stars-One的杂货小窝

    EventBus的Github

    Event bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality

    Android和Java的事件总线,简化了活动,片段,线程,服务等之间的通信。代码越少,质量越好

    EventBus是一款事件分发框架,可以跨进程,跨Activity/Fragment进行通信,今天来简单的来入下门

    介绍

    EventBus可以做什么?

    这里来个例子比较好说明,我们知道Android中有个广播机制,可以让Activity和Service互相通信,但是写法过于麻烦,且不够灵活;

    又比如,一个Activity中含有几个Fragment,其中的Fragment互相又要实现传数据通信,同时,也要与外层的Activity进行数据的交互,按照常规套路,我们使用传参,写法十分复杂

    这个时候,我们就可以使用EventBus,就可以十分快速且简单地实现我们需要实现的效果

    本质上,EventBus也是使用了观察者模式来实现其的功能

    基本使用

    1.绑定Activity

    首先,导入依赖

    implementation 'org.greenrobot:eventbus:3.0.0'
    
    • 需要在Activity中的onCreate()方法中,与当前Activity绑定
    • 在Activity的onDestroy()方法中,进行解绑,否则会造成内存泄漏问题
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_event_bus)
        //绑定
        EventBus.getDefault().register(this)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        //取消绑定
        EventBus.getDefault().unregister(this)
    }
    

    Activity的界面比较简单,就是一个TextViewFrameLayout,之后创建一个Fragment放入FrameLayout

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".EventBusActivity">
        <TextView
            android:id="@+id/tvContent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20sp"
            android:text="Hello world" />
        <FrameLayout
            android:id="@+id/framelayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>
    

    2.声明入口方法

    在当前的绑定的Activity中声明一个public的方法,返回值为void,同时,使用EventBus的注解@Subscribe对方法进行标识

    注:此注解是3.0.0版本以后才加的,且方法一定是要公共的,否则EventBus会报错,原因也是很简单,估计EventBus是通过注解去找到方法,之后利用Java的反射特性进行回调

    @Subscribe(threadMode = ThreadMode.MAIN)
    public fun changeText(str:String){
        tvContent.text = str
    }
    

    threadMode有四种模式:

    • POSTING(默认):如果使用事件处理函数指定了线程模型为POSTING,那么该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。在线程模型为POSTING的事件处理函数中尽量避免执行耗时操作,因为它会阻塞事件的传递,甚至有可能会引起应用程序无响应(ANR)。
    • MAIN:事件的处理会在UI线程中执行。事件处理时间不能太长,长了会ANR的。
    • BACKGROUND:如果事件是在UI线程中发布出来的,那么该事件处理函数就会在新的线程中运行,如果事件本来就是子线程中发布出来的,那么该事件处理函数直接在发布事件的线程中执行。在此事件处理函数中禁止进行UI更新操作。
    • ASYNC:无论事件在哪个线程发布,该事件处理函数都会在新建的子线程中执行,同样,此事件处理函数中禁止进行UI更新操作。

    这里我们选用Main.且为了简单起见,方法定义一个String类型,之后把activity中的文本修改为传过来的数据

    这个方法其实就是事件的接收者,之后在其他地方(如Fragment,Service或其他Activity)发出事件,EventBus会根据参数类型寻找对应的入口,同时将数据传到当前的入口,我将其称为入口方法

    方法类型可以随意定义,一般是某个事件定义个类用来存储传过来的数据,规范一点的话,可以统一下事件类中的格式,使用枚举来区分不同事件(当然,这种就比较适合那种只有一个入口)

    3.post()方法发事件

    之后我们在其他调用post方法发出事件即可,这里给大家演示下载Fragment中的按钮发出事件

    Activity中设置Fragment

    Fragment按钮点击事件设置

    btnChangeText.setOnClickListener {
    	EventBus.getDefault().post("修改过后的文字")
    }
    

    之后即可实现点击按钮实现改变文字的效果,如下图

    补充-postSticky()方法

    上述中,使用的post()方法,但是可以看到代码提示中还存在一个postSticky()方法,这个方法是由什么区别呢?

    postSticky()是对应的粘性事件,我们可以看到Subscribe注解中存在一个sticky属性,其默认是false

    看到这就可以猜测到了,这两者是配合使用的

    那么什么是粘性事件呢?

    比如说你发出了一个事件,但是由于对应的事件消费的Activity或Fragment对象还没有被创建,于是你发出的事件就会被丢弃了

    为了避免这种情况,EventBus提供了粘性事件,它会把事件先存在队列中,等待Activity或Fragment启动,则会自动把事件分发过去

    postSticky()的使用与post()一样,这里不再赘述

    插件推荐

    由于使用了EventBus,排查代码的时候非常不好排查,这里推荐大家一款Android Studio的插件,可以快速跳转到对应的入口方法或是发出方法的代码

    名字为EventBus3-IDEA

    安装之后,你就可以看见旁边会有个小图标,点击之后会跳转到对应的代码

    不过测试的时候感觉对Kotlin语言还没适配,点击没法跳转,等作者等后续适配...

    参考


    提问之前,请先看提问须知 点击右侧图标发起提问 联系我 或者加入QQ群一起学习 Stars-One安卓学习交流群 TornadoFx学习交流群:1071184701
  • 相关阅读:
    输入框的提示文字的样式设置
    javascript高级程序设计第3版——第12章 DOM2与DOM3
    javascript高级程序设计第3版——第1Java章 DOM扩展
    javascript高级程序设计第3版——第10章 DOM
    javascript高级程序设计第3版——第8章 BOM(浏览器对象模型)
    javascript高级程序设计第3版——第7章 函数表达式
    javascript高级程序设计第3版——第6章 面向对象的程序设计
    小程序上传图片
    微信小程序验证码/密码输入框,一个框一个数字
    php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法
  • 原文地址:https://www.cnblogs.com/stars-one/p/15562982.html
Copyright © 2020-2023  润新知