自从在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