消息框架的一种实现

自从在Android中用上了消息框架,屡试不爽。不管是主线程发任务到后台线程,还是后台线程返回结果到主线程,甚至是完全在主线程中的调用,都用发消息-监听消息-收消息这种方式处理,真是解耦利器。

之前写过的两篇文章:用消息机制获取网络数据 和 用消息机制解耦Activity跳转

之前在工程中都用的是开源的EventBus,很好用,但是因为是定制好的,缺少很多灵活性,监听方法不可改名,不可从父类override,不可以通过泛型参数声明,等等。

自己尝试用Handler实现了一个消息框架,还没完全搞明白,目前可以满足一个小工程用的需求。几个角色:

IMessage,定义消息,封装业务需求、业务数据,比如网络请求消息,网络请求结果返回消息,activity跳转消息等;

IMessageListener<? extends IMessage>, 消息监听器,泛型声明了一个消息的类型,就是说一个消息监听器,负责监听某一类的消息。这个由监听消息的业务类去实现;

MessageCenter, 消息中心,维护一个IMessageListener列表,接收IMessage来发送消息,收到消息后,通过遍历IMessageListener列表把消息实体分发给对应的监听器。核心方法有三个:registListener, unRegistListener, sendMessage,分别是注册监听器,解注册监听器,发送消息。其内部实现是两个Handler,一个是主线程的Handler,负责在主线程接收消息,另一个是一个后台线程的Handler,负责在后台线程接收消息,这样消息一收到就会在后台线程中异步执行,不需要客户代码自己起异步线程。

所有代码在Gist: An Implementation of Android Message Framework.

https://gist.github.com/Viyu/a29bc80c62a244609287

时间: 2024-11-14 19:23:08

消息框架的一种实现的相关文章

消息框架 message

在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户.这个消息框架允许你临时将消息存储在请求中,并在接下来的请求(通常就是下一个请求)中提取它们并显示.每个消息都带有一个特定的level标签,表示其优先级(例如info. warning或error). 一.启用消息框架 Django的messages消息框架的实现,依赖messages中间件和对应的

[编织消息框架]前言

出书缘由 本项目名叫onequeue意为一流消息队列,参考对象为kafka 虽然最终结果可能达不到一流水准,但那不是主要的,主要是做的心态保持一流的态度 为什么作为kafka参考,又为什么自己重新做? 我在预研kafka发现在发送消息时网络断开会造成消息丢失,而底层没有提供失败回调给开发者使用,在某些场景来讲不允许丢消息的 进一步深入看下源码,虽然某些领域kafka开者人员很熟悉但综合水平觉得不如我,所以产生写消息框架的想法 面向读者 如果你喜欢网络传输,数据存储方向,那么本书会非常适合你,但你

FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法

看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法. 早前,看过文章说TMessageManager的用法,可用到的时候,又找不到,只好自己动手. 我的应用场景是这样: 当前的Frame弹出一个对话框Frame,当操作对话框的时候,想让当前的Frame跟着应响,让用户看到操作的结果,如下图,点大中小字体,后面的题目的字体会跟着变化: 参考fmx的代码,试着用消息机制实现了: 1.声明消息类: typ

MVC到底是设计模式还是一种框架还是一种架构? https://www.zhihu.com/question/31079945

具体知乎讨论内容:https://www.zhihu.com/question/31079945 MVC到底是设计模式还是一种框架还是一种架构? 我认为它是3种设计模式的演变和组合:观察者模式(Observer),策略模式(Strategy),组合模式(Composite) (我也不知道我的观点是正确的还是错误的),你的观点也不一定是错的,我直接把知乎里面讨论的地址给发出来.https://www.zhihu.com/question/31079945 仁者见仁智者见智,经过辩论才能知道到底是什

Seele元一正式公开第二部黄皮书“区块链网络中消息传播的一种加速方法”

9月5日,Seele元一公开发表第二部黄皮书"区块链网络中消息传播的一种加速方法".当晚,Seele首席科学家毕伟博士在台湾大学Seele全球名校行首站活动中,与台湾大学资讯工程系廖世伟教授.台大学生及校友面对面解读黄皮书内容.继8月10日发表"多重椭圆曲线的数字签名方法"后,为产业而来的Seele元一不断落实系列黄皮书发表计划.传统区块链网络中,扩展区块链的关键问题之一,就是最小化获胜区块传播与次轮竞争启动间的时间间隔.本次公布的第二部黄皮书中对此提出一种新的解决

Laravel框架定时任务2种实现方式示例

本文实例讲述了Laravel框架定时任务2种实现方式.分享给大家供大家参考,具体如下: 第一种 1.生成一个commands文件 > php artisan make:command test 2.打开文件进行修改 laravel\App\Console\Commands\test.php <?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\Lo

Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法 Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk). Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用 JDK提供的Proxy,和spring进一步封装的CGLIB.二者生成的代理没有任何区别,生成的都是代理对象.只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象 如何切换spring框架中默认生成代理的方式 <aop:config proxy-ta

QMessageBox消息框的几种类型

QMessageBox消息框的几种类型 QMessageBox.information 信息框 QMessageBox.question 问答框 QMessageBox.warning 警告 QMessageBox.ctitical危险 QMessageBox.about 关于 可根据事件的严重级别选择合适的消息框,这一点类似logger. 注意QMessageBox.question()的格式 QMessageBox.question(self,'对话框','是否确认退出',QMessageB

分布式异步消息框架构件3 —— 自动消息路由

这个系列慢慢变成先设想后完成的模式了,上篇我们测试了以Yield当多任务处理. 楼主写了个小Demo也完成了类似功能,并且支持中途等待,直接等到完成回调后,继续处理下一阶段. 这个功能可以完成类似逻辑事件流,比如C需要等待A,B完成后再执行,而且写法也比较简单.直接上代码: //创建事件,把Handle丢入Yield队列, //执行当发现有等待Handle状态为YieldWating //放入YieldWating队列 //回调时检查YieldWating队列,重新激活 Context.Wati