Dhroid框架笔记(IOC、EventBus)
dhroid 目前包含了6大组件供大家使用
1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系
2.Eventbus: android平台事件总线框架,独创延时事件,事件管理轻松
3.Dhnet: 网络http请求的解决方案,使用简单,减少代码,自带多种网络访问缓存策略
4.adapter模块: 数据绑定轻松,不用写多余的adapter,天生网络支持(一行代码搞定加载,刷新问题)
5.DhDb: android中sqlite的最轻量orm框架(增删改查轻松搞定)
6.Perference: android自带Perference 升级版,让你的Perference更强大,更方便
说了这么多,来点干货吧
1.1 IOC容器的注解
1.1.1 注入视图
@InjectView(id=R.id.text)TextView textV;
//注入布局文件
@InjectView(layout=R.layout.ioc_head)ViewGroup headV;
//添加注入事件
@InjectView(id=R.id.assertFile,click="toInstal")View instalApkV; //
@InjectView(id=R.id.listView,itemClick="toEditStudent",itemLongClick="toDeleteStudent")ListView listView; public void toEditStudent(AdapterView<?> parent, View view, int position, long id) {
Log.v("dhroid", "itemClick事件");
}
public void toDeleteStudent(AdapterView<?> parent, View view, final int position, long id) {
Log.v("dhroid", "itemLongClick事件");
}
1.1.2注入资源
使用注解@InjectResource,资源可以注入drawable,string,color,dimen
//注入字串
@InjectResource(string=R.string.app_name)
String appname;
//注入颜色
//这里不能为int因为int有默认值0 有值的属性会被忽略,防止重复注入
@InjectResource(color=R.color.link)
Integer colorLink;
//注入图片
@InjectResource(drawable=R.drawable.ic_launcher)
Drawable icDraw;
//注入dimen
@InjectResource(dimen=R.dimen.testdimen)
Float dime;
1.1.3 注入extra
页面间数据传递也可以注入的,下面代码相当于getIntent().getStringExtra("str");
//接受传入的字符串
@InjectExtra(name="str",def="默认值")String extra;
Integer,Long,Float,Double,Boolean(特殊的JSONObject,JSONArray,其他bean对象都能传)
这里需要特殊说明一下不能使用int,long,float,double因为他们有默认值,注入时发现有值会滤过的
如果有默认值请写到def属性下,
特殊的JSONObject,JSONArray和bean对象是特殊强制转换的结果,传入的对象都还string类型
传入时
it.putExtra("jo", "{name:'我是json字符串'}");
it.putExtra("array", "[{name:'我是json数组'}]");
it.putExtra("bean", "{name:'我是json字符串'}");
接受时
@InjectExtra(name="jo")JSONObject extrajo;
@InjectExtra(name="array")JSONArray extraarray;
@InjectExtra(name="bean")User extrauser;
1.1.4 注入assert
@InjectAssert主要是用来注入assert中的文件的
下面代码可以注入assert文件夹下面的testtext.json的文本内容
@InjectAssert(path="testtext.json") String testassert; @InjectAssert(path=“testtext.json”) //文本内容本来就是json可以写为 JSONObject jo;
@InjectAssert(path="anzhi.apk") File apkFile;
因为assert本身不支持文件读写的所以其实先将文件拷贝出去后然后赋值的,文件拷贝时是异步的使用时需要注意文件是否拷贝完成,
可以在需要使用前面的页面就进行一次注入(文件只会拷贝一次)
Fragment 中使用 如果你不是继承自BaseActivity,你需要在setContentView()后调用 InjectUtil.inject(this);
如果你在Fragment 中使用,需要在onActivityCreated方法中调用 InjectUtil.inject(this);
同时还可以在自定义View中使用,也是InjectUtil.inject(this);
其实BaseActivity里面很简单的
关于类继承问题
继承类时
父类中的 只有有共有属性,即public的属性才能被注入
1.5 对象依赖问题
//或者在属性在加注解 @InjectIDialog dialoger;
IocContainer的知识:
使用ioc需要先在application初始化
//IOC的初始化
IocContainer.getShare().initApplication(this);
IocContainer.getShare().bind(具体实现类).to(目标类或借口) //这是单例 .scope(作用域)
//接受传入的字符串
@InjectExtra(name="str",def="默认值")
String extra;
//接受传入的数字
@InjectExtra(name="int",def="1")
Integer extraint;
//接受传入的json对象(传入时是已字符串传入的)这个默认值没用
@InjectExtra(name="jo")
JSONObject extrajo;
//标准注入 单例 注入接口 需要在application中配置
@Inject
IDialog dialoger;
//标准注入 单例 注入类
@Inject
DhDB db;
//根据tag拿对象这里拿到的manager1和manager1copy是同一对象,manager2和manager2copy是同一对象
@Inject(tag="manager1")
TestManager manager1;
@Inject(tag="manager1")
TestManager manager1copy;
@Inject(tag="manager2")
TestManager manager2;
@Inject(tag="manager2")
TestManager manager2copy; //这个测试根据名字获取对象配置请看application
@Inject(name="testmm")//这里获取到的对象是TestManagerMM
TestManager managermm;
2.1 EventBus 事件总线
eventbus 事件总线也是一个编程思想,为什么要设计EventBus了,因为他是领域驱动设计中比不可少的模块,它承担传输数据的作用,它可以解耦模块之间的耦合性。
在Android开发过程中,我们总会遇到各个组件模块之间的通信,当功能点越来越多的时候,组件间的通信难免会变得混乱。
案例1:
需求:假设你有A,B,C,D,E,F几个页面,A 是列表,A->B,或者A->C,B->D->E-F,F 是发布页,A页面从B,C,D,E返回时都是不需要刷新的,只有从F返回,A才需要刷新;
需求:有一个service是轮询后台服务器的查看用户消息数,当有新消息时,如果用户在msg页面,需要刷新当前页
需求:在第一个页面的左侧滑中,会显示用户的头像,用户名等信息,你是每次打开侧滑时你是一直获取数据吗,当然有人知道可以放到perference中但是什么时候更新perference中的数据了,用户更新了各种资料,发布了什么都可以更新数据,维护这个更新也不容易吧
使用eventbus只需要在类中注入一个eventbus单例接口:
@Inject EventBus bus;
//这个是在后台处理事件
bus.registerListener("事件名", "监听器名字", new OnEventListener(){
@Override
public Boolean doInBg(Event event) {
super.doInBg(event);Log.v(log_tag, "我是在后台线程处理的请勿操作UI,我接受到的参数是"+event.getParams()[0]);
return false; } });
或者
//这个是前台处理事件
bus.registerListener("事件名", "监听器名字", new OnEventListener(){
@Override
public Boolean doInUI(Event event) {
super.doInUI(event);dialoger.showToastShort(EventBusOneActivity.this, 我是在UI线程处理的,我接受到的参数1是"+event.getParams()[0]+"我接受到的参数2是"+event.getParams()[1]); return false;}});
在onCreate中注册 需要在finish取消注册;在onResume中注册需要在onStop取消注册。
我们的监听是有延时的,就是说registerListener时,eventbus会将之前发布的事件触发一下,也就是说你先fireEvent,然后在registerListener也是可以监听到事件的
有人可能会问为什么会这样设计
因为我希望 A 页面中,在onResume中我们注册事件,在onStop中我们取消监听
如果你要清空你注册事件之前发布的事件可以
bus.clearEventTime("事件名", "监听名");
bus.fireEvent("事件名","可以传递多个参数","参数2");
bus.unregisterListener("事件名","监听器名");
问题2解决,只需要在service中发布事件,在你有关的页面,监听事件就行
问题3解决, 先注册一个监听器,事件发布时网络获取用户信息,当用户更新头像后,发布一下事件就行
下面是用注解实现:
@OnEvent(name="事件名",ui=true,onBefore=true) public void onEvent2(String p1,String p2){
dialoger.showToastShort(this, "事件2触发参数1:"+p1+"参数2:"+p2 );
}
注解name参数,事件名,ui是否在ui线程,onBefore=true,可以监听事件监听前的事件.
当然使用这个注解还需要:
@Override
protected void onResume() {
super.onResume();
EventInjectUtil.inject(this); } @Override protected void onStop() { super.onStop();
EventInjectUtil.unInject(this);
}
Dhroid框架笔记(IOC、EventBus)的更多相关文章
- Dhroid框架笔记(DhNet、Adapter)
3.1.1 DhNet用于获取网络中的数据 DhNet net=new DhNet("路劲"); net.addParam("key", "参数&qu ...
- LCLFramework框架之IOC
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...
- [Java] SSH框架笔记_SSH三大框架的工作原理及流程
Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.x ...
- MyBatis 框架笔记
Mybatis 框架笔记 ------技术源于热爱! 获取更多内容请关注小编的个人微信公众平台 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jd ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Spring框架之IOC(控制反转)
[TOC] 第一章Spring框架简介 IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向 ...
- Spring框架中IoC(控制反转)的原理(转)
原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...
- Spring框架的IOC核心功能快速入门
2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
随机推荐
- DDD的ABP开发框架
基于DDD的ABP开发框架初探 一.基本概念 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP是土耳其的以为架构师hikalkan开发 ...
- Unity网络斗地主 服务端
Unity网络斗地主 服务端 @by梦想之家2工作室 阿龙 已经做好了服务器框架,并且能实现服务器给客户端分牌的问题!
- IHS怎么通过80端口连接WAS——<转>
IHS如何通过80端口连接WAS? 经常看到有朋友问这个问题,所以简单总结一下基本步骤: IHS和WAS之间是通过Plugin来实现的,一般的Plugins和IHS安装在同一物理机器上,WAS安装 ...
- CBO学习笔记(转)
Query Transformation 在继续研究SQL的其他操作(比如Join)对CBO的影响之前,我们来讨论一下Oracle优化器的Query Transformation特性.我们都习惯于根据 ...
- 【Linux】鸟哥的Linux私房菜基础学习篇整理(十)
1. at [-mldv] TIME/at -c 工作号码:单一工作调度.参数:-m:当at的工作完成后,即使没有输出信息,以email通知用户该工作已完成:-l:相当于atq,列出目前系统上面的所有 ...
- 怒刷BZOJ记录(一)1001~1037
我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-7-9 : 1001[BeiJing2006]狼抓兔子 | 最大流练习(呃..其 ...
- Linux Shell编程(8)——变量详解
不同与许多其他的编程语言,Bash不以"类型"来区分变量.本质上来说,Bash变量是字符串,但是根据环境的不同,Bash允许变量有整数计算和比较.其中的决定因素是变量的值是不是只含 ...
- i++和++i的老问题
对于++j,该式是指先将j的值自加1,然后再取j的值.自增过后参与计算 i的值也为10:对于i++,该表达式是指先取i的值做运算,再将i加1.参见过计算后再自增
- Redis源码阅读笔记(2)——字典(Map)实现原理
因为redis是用c写的,c中没有自带的map,所以redis自己实现了map,来看一下redis是怎么实现的. 1.redis字典基本数据类型 redis是用哈希表作为字典的底层实现,dictht是 ...
- CodeForces 593A
题目链接: http://codeforces.com/problemset/problem/593/A 题意: 给你n个字符串,字符串只包含小写字母,从中选取任意个字符串,拼成一封信,这封信中至多有 ...