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 ...
随机推荐
- CentOS 6.3 配置FTP
一.FTP的安装 .检测是否安装了FTP:[root@localhost ~]# rpm -q vsftpd 如果安装了会显示版本信息: [root@localhost ~]# vsftpd-2.0. ...
- 关于pcre正则表达式库libpcre
gcc 4.8中已经包含了std regex的头文件 可是没有实现,所以链接是失败的 gcc 4.9完整的支持了c++ 11的regex. 在4.9以前,可以寻求boost的regex. 不过,我更熟 ...
- 转:windows下使用gvim搭建简单的IDE编译环境(支持C/C++/Python等)
原文来自于:http://www.cnblogs.com/zhuyp1015/archive/2012/06/16/2552269.html 使用gvim在windows环境下搭建简单的IDE环境可以 ...
- 转:使用Mongo Connector和Elasticsearch实现模糊匹配
原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connec ...
- BZOJ 1050 旅行
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- BZOJ 1015 星球大战
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- oracle 中使用触发器自动生成UUID
create or replace trigger tri_test before insert on test for each row declare begin if :new.uuid is ...
- java学习面向对象之继承
在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...
- [LeetCode#82]Remove Duplicates from Sorted Array II
Problem: Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? F ...
- winform登录时,在密码框按下回车,直接登陆
//按回车,焦点跳到密码文本框 private void txtUserName_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyCha ...