Skip to content

EventBus的使用介绍

前言

使用FongMi影视时,未配置在线壁纸,系统默认的壁纸只有4种纯色,如何修改成自定义图片作为壁纸?

简介

EventBus是一个开源库,由GreenRobot开发而来,是用于Android开发的 “事件发布—订阅总线”, 用来进行模块间通信、解藕。它可以使用很少的代码,来实现多组件之间的通信。

Android系统内置的事件通讯存在缺点: Android系统中的事件通信则是 handler (消息机制) 和 BroadCastReceiver (广播机制), 通过它们可以实现组件之间的事件通讯。缺点在于,代码量多、组件之易产生藕合引用。

FongMi影视壳,采用的是GreenRobot开源库。

背景

当我们进行项目开发的时候,经常会遇到组件与组件之间、组件与后台线程之间的通信, 比如:子线程中执行数据请求,数据请求成功后,通过 Handler 或者 BroadCast 来通知UI更新。 两个Fragment之间可以通过Listener进行通信,但是问题来了,当程序越来越大时,就会要写很多的代码, 而且导致代码严重的耦合问题。为此 ,EventBus 应运而生。

工作流程图解

Publisher使用post发出一个Event事件,Subscriber在onEvent()函数中接收事件。

EventBus 是一款在 Android 开发中使用的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信,使用简单、效率高、体积小!下边是官方的 EventBus 原理图: 1713927064155

使用步骤

1.添加依赖 FongMi包里 TV/app/build.gradle:137行

shell
    implementation 'org.greenrobot:eventbus:3.3.1'

2.发送事件 以设置里的修改默认壁纸颜色为例

1713928015721

找到布局文件layout

app/src/mobile/res/layout/fragment_setting.xml。组件的id为wallDefault

1713928113165

找到对应的控件代码

app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java

在初始化事件方法initEvent中,看到注册了点击事件

java
mBinding.wallDefault.setOnClickListener(this::setWallDefault);

点击时,发送总线消息

java
// 每次点击时,wall的值加一,最多到4
	private void setWallDefault(View view) {
        WallConfig.refresh(Setting.getWall() == 4 ? 1 : Setting.getWall() + 1);
    }
// 当前设定值持久化,发送消息到总线
    public static void refresh(int index) {
        Setting.putWall(index);
        RefreshEvent.wall();
    }
// app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java 执行EventBus的post方法
    public static void wall() {
        EventBus.getDefault().post(new RefreshEvent(Type.WALL));
    }

3.订阅事件

在基础activity中,app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java,已经注册了上述刷新事件,监听主线程的RefreshEvent事件:

java
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onRefreshEvent(RefreshEvent event) {
        if (event.getType() != RefreshEvent.Type.WALL) return;
        WallConfig.get().setDrawable(null);
        setWall();
    }

清空了自定义壁纸,然后设置了本地默认图片背景

java
    private void setWall() {
        try {
            if (!customWall()) return;
            File file = FileUtil.getWall(Setting.getWall());
            if (file.exists() && file.length() > 0) getWindow().setBackgroundDrawable(WallConfig.drawable(Drawable.createFromPath(file.getAbsolutePath())));
            else getWindow().setBackgroundDrawableResource(ResUtil.getDrawable(file.getName()));
        } catch (Exception e) {
            getWindow().setBackgroundDrawableResource(R.drawable.wallpaper_1);
        }
    }

若未找到自定义文件,执行本地图片资源设置为背景R.drawable.wallpaper_1

shell
app/src/mobile/res/drawable-nodpi/wallpaper_1.webp

1713929124816 4.新增自定义壁纸

app/src/mobile/res/drawable-nodpi/wallpaper_1.webp默认第一个壁纸,可以直接替换掉该壁纸,或者新增一个按照wallpaper_{编号}.webp取名。 点击切换时,根据实际壁纸数量修改

java
// 每次点击时,wall的值加一,最多到4
	private void setWallDefault(View view) {
    // 若只有一张,可以写死成  WallConfig.refresh(1);
        WallConfig.refresh(Setting.getWall() == 4 ? 1 : Setting.getWall() + 1);
    }

参考

csdn文章:https://blog.csdn.net/m0_49508485/article/details/127780285