在android中,组件间通信常用的方式:

1、使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可

例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化。当点击菜单时发送广播通知容器变化显示的Fragment

2、使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法

3、事件驱动方式:EventManager

最近在网上看到EventBus这个开源的工程,使用订阅者与发送者模式进行信息传递非常适合项目使用,并且耦合度可以降到非常低!

这个完全可以自己根据业务需求自己实现,主要的逻辑就是:注册事件,取消监听,发送事件 ,需要注意的是事件管理使用单例模式是比较合适的,但是需要注意并发问题!

代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import android.os.Handler;
import android.os.Looper; public class EventManager { public static class Message {
public int what;
public Object obj;
} public static interface OnEventReceiver {
public void onEvent(Message message);
} private static EventManager manager;
private Map<Class, List<OnEventReceiver>> map = new HashMap<Class, List<OnEventReceiver>>();
private Handler handler = new Handler(Looper.getMainLooper()); public static EventManager getDefault() { if (null == manager) {
synchronized (EventManager.class) {
if (null == manager) {
manager = new EventManager();
}
}
} return manager;
} private EventManager() {
} public synchronized void register(Class clazz, OnEventReceiver receiver) { List<OnEventReceiver> receivers = map.get(clazz); if (null == receivers) {
receivers = new ArrayList<EventManager.OnEventReceiver>();
map.put(clazz, receivers);
} receivers.add(receiver);
} public synchronized void unRegister(Class clazz) {
map.remove(clazz);
} public synchronized void postMessage(Class clazz, final Message message) { List<OnEventReceiver> receivers = map.get(clazz); if (null != receivers) {
//判断是否在主线程中
boolean isUiThread = Looper.getMainLooper() == Looper.myLooper(); for (final OnEventReceiver receiver : receivers) { if (!isUiThread) {
handler.post(new Runnable() { @Override
public void run() {
receiver.onEvent(message);
}
});
} else {
receiver.onEvent(message);
} }
}
} }

更多的功能需要根据业务需求进行修改,注意并发哦!!

Android 组件间通信--事件驱动的更多相关文章

  1. Android组件间通信库EventBus学习

    项目地址:   https://github.com/greenrobot/EventBus EventBus主要特点 1. 事件订阅函数不是基于注解(Annotation)的,而是基于命名约定的,在 ...

  2. Android组件间交互

    四大组件相信大家都不陌生了吧,今天咱们就组件间通信做个说明: 首先: 主要今天的目的是为了说明Android 提供的一个ResultReceiver类,这个类相信大家都不陌生吧>?但是你们层深入 ...

  3. React Native组件间通信

    React Native组件间通信 React Native组件的关系有:父子关系.无直接关系.组件间通信主要针对这两类来讨论. 一.父组件和子组件之间通信 父组件向子组件传递消息.数据通过对子组件的 ...

  4. React独立组件间通信联动

    React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而 ...

  5. 聊聊Vue.js组件间通信的几种姿势

    写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出. 文章的原地址:https://github.com/a ...

  6. 【Vue】利用父子组件间通信实现一个场景

    组件间通信是组件开发的,我们既希望组件的独立性,数据能互不干扰,又不可避免组件间会有联系和交互. 在vue中,父子组件的关系可以总结为props down,events up: 在vue2.0中废弃了 ...

  7. 解决SpannableString在Android组件间传递时显示失效的问题

    问题:在A activity中传递一个SpannableString到B activity中,并最终传递到B activity中的TextView中,但是没有展示出Span效果. 解决:阅读TextV ...

  8. React 精要面试题讲解(二) 组件间通信详解

    单向数据流与组件间通信 上文我们已经讲述过,react 单向数据流的原理和简单模拟实现.结合上文中的代码,我们来进行这节面试题的讲解: react中的组件间通信. 那么,首先我们把看上文中的原生js代 ...

  9. vue_组件间通信:自定义事件、消息发布与订阅、槽

    自定义事件 只能用于 子组件 向 父组件 发送数据 可以取代函数类型的 props 在父组件: 给子组件@add-todo-event="addTodo" 在子组件: 相关方法中, ...

随机推荐

  1. 浅析Java7中的ConcurrentHashMap

    引入ConcurrentHashMap 模拟使用hashmap在多线程场景下发生线程不安全现象 import java.util.HashMap; import java.util.Map; impo ...

  2. 使用HashMap或Hashset优化使用循环判断字符串中是否含有重复元素

    原本遇到判断字符串中是否含有重复元素的问题总是使用for循环遍历进行判断,这一方法则需要O(n3)的时间复杂度,如果本身方法处于几个循环中,就会指数倍增加时间复杂度.类似于如下代码: String[] ...

  3. EasyPoi 导入导出Excel时使用GroupName的踩坑解决过程

    一.开发功能介绍: 简单的一个excel导入功能 二.Excel导入模板(大致模板没写全): 姓名 性别 生日 客户分类 联系人姓名 联系人部门 备注 材料 综合 采购 张三 男 1994/05/25 ...

  4. 三步教你如何在Github部署自己的简历

    相信铁子们有很多都是将找工作的小白(和小编一样!!嘿嘿)小编也和在座的大家一样,一个普通的不能再普通的二本学生(北华大学) <  单身!单身!单身!> 听很多人都说:像我们这个样子,害!放 ...

  5. python学习笔记(六)---文件操作与异常处理机制

    文件读取 读取整个文件 要读取文件,需要一个包含几行文本的文件.下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行: pi_digits.txt 3.14159 ...

  6. SOCKET网络基础

  7. JDK 15 JAVA 15的新特性展望

    目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...

  8. Scala教程之:深入理解协变和逆变

    文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个cla ...

  9. awk和sed命令

    awk awk是一个强大的编辑工具,可以在无交互的情况下实现相当复杂的文本操作 awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 a ...

  10. 使用3种协议搭建yum仓库

    制作本地yum仓库 开启服务一般要关闭防火墙,selinux之后再reboot ## 方案一:FTP协议------ftp://IP 下载vsftpd---启动vsftpd---ftp://10.0. ...