前言上一篇跟大家分享了如何在鸿蒙系统中实现圆角,这一期我们来跟大家分享一下如何实现发布/订阅的事件总线,也就是我们在Android开发中常用的EventBus、RxBus等框架。 开始之前,我们先回顾下Android里面的事件发布/订阅是个什么东西? 像EventBus、RxBus是我们在Android应用开发中常选用的发布/订阅事件框架,用来代替传统的Intent,Handler,Broadcast,在Ac tivity,Fragment,Service线程之间传递数据,执行方法。 它有很多优点:简化应用组件间的 通信;解耦事件的发送者和接收者;避免复杂和容易出错的依赖和生命周期的问题;速度快,专门为高性能优化过等等。 主要工作原理:事件源将产生的消息发送到事件总线的特定通道之上,然后监听器在事先会订阅事务总线之中不同的通道以区分消息的响应,然后当消息被发送到事务总线的特定通道之中时,所对应的监听器会监听到消息,然后监听器根据程序中设置的响应函数进行执行。 那在鸿蒙系统中,肯定是没有现成的EventBus或者RxBus给我们直接用的,那么我们如何在鸿蒙系统中的Slice,Ability,Service,线程之间传递消息,执行方法呢? 磨刀不误砍柴工啊,兄dei,要是不先把这个工具库写出来,这么几周的时间怎么完成一个鸿蒙App呢,产品手中的30m大刀可不是闹着玩的啊。 由于鸿蒙只能使用Java代码,所以我们看上了RxJava这个小兄弟,何不像在Android中一样,在rxjava的基础上封装一个RxBus呢?跟Android大哥看齐不香么? 好的,说干就干,我们来手lu一个鸿蒙版的RxBus。
实现鸿蒙Rxbus1、先引入Rxjava库
- implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
复制代码
2、创建鸿蒙线程调度HARMonySchedulers
- import io.reactivex.rxjava3.annotations.NonNull;
- import io.reactivex.rxjava3.core.Scheduler;
- import io.reactivex.rxjava3.schedulers.Schedulers;
- import java.util.concurrent.Executor;
-
- public class HarmonySchedulers implements Executor {
-
- private static HarmonySchedulers instance;
- private final Scheduler mMainScheduler;
- private TaskDispatcher uiTaskDispatcher;
-
- private HarmonySchedulers() {
- mMainScheduler = Schedulers.from(this);
- }
-
- public static synchronized Scheduler mainThread() {
- if (instance == null) {
- instance = new HarmonySchedulers();
- }
- return instance.mMainScheduler;
- }
-
- @Override
- public void execute(@NonNull Runnable command) {
- if (uiTaskDispatcher == null) {
- uiTaskDispatcher = getMainAbility().getUITaskDispatcher();//注意,这里要用Ability来获取UI线程的任务发射器,Ability自己想办法获取
- }
- uiTaskDispatcher.delayDispatch(runnable, delayTime);
- }
- }
复制代码
3、创建RxBus类,实现订阅、注册、取消注册等功能
- @SuppressWarnings("unused")
- public class RxBus {
- public static final String LOG_BUS = "RXBUS_LOG";
- private static volatile RxBus defaultInstance;
-
- private Map> subscriptionsByEventType = new HashMap<>();
-
- private Map
复制代码
4、添加其他附加类BusData.java 事件数据封装
- public class BusData {
- String id;
- String status;
- public BusData() {}
- public BusData(String id, String status) {
- this.id = id;
- this.status = status;
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getStatus() {
- return status;
- }
- public void setStatus(String status) {
- this.status = status;
- }
- }
复制代码
Subscribe.java 注解类
- @Documented
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- public [url=home.php?mod=space&uid=2697273]@interface[/url] Subscribe {
- int code() default -1;
-
- ThreadMode threadMode() default ThreadMode.CURRENT_THREAD;
- }
复制代码
SubscriberMethod.java 执行注册方法封装
- public class SubscriberMethod {
- public Method method;
- public ThreadMode threadMode;
- public Class> eventType;
- public Object subscriber;
- public int code;
-
- public SubscriberMethod(Object subscriber, Method method, Class> eventType, int code,ThreadMode threadMode) {
- this.method = method;
- this.threadMode = threadMode;
- this.eventType = eventType;
- this.subscriber = subscriber;
- this.code = code;
- }
-
- /**
- * 调用方法
- * @param o 参数
- */
- public void invoke(Object o){
- try {
- Class[] parameterType = method.getParameterTypes();
- if(parameterType != null && parameterType.length == 1){
- method.invoke(subscriber, o);
- } else if(parameterType == null || parameterType.length == 0){
- method.invoke(subscriber);
- }
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- }
复制代码
ThreadMode.java 线程模型,用来标识事件运行线程
- public enum ThreadMode {
- /**
- * current thread
- */
- CURRENT_THREAD,
- /**
- * android main thread
- */
- MAIN,
- /**
- * new thread
- */
- NEW_THREAD
- }
复制代码
使用Rxbus1、定义事件参数类
- public class RxbusEvent {}
复制代码
2、定义事件接收者
- public class RxBusDemoAbilitySlice extends AbilitySlice {
- @Override
- protected void onStart(Intent intent) {
- super.onStart(intent);
- RxBus.get().register(this);//注测rxbus
- }
- @Override
- protected void onStop() {
- super.onStop();
- RxBus.get().unRegister(this);//注销rxbus
- }
- /**
- * 接收事件
- * @param rxbusEvent
- */
- @Subscribe(threadMode = ThreadMode.MAIN)
- public void rxBusRxbusEvent(RxbusEvent rxbusEvent) {
- if (rxbusEvent == null) {
- return;
- }
- //执行对应操作
- }
- }
复制代码
3、发送事件
- RxBus.get().send(new RxbusEvent());//发送事件
复制代码
0
|
|
|
|