【Android开发经验】来,咱们自己写一个Android的IOC框架!
到眼下位置。afinal开发框架也是用了好几个月了,还记得第一次使用凝视完毕控件的初始化和事件绑定的时候,当时的心情是多么的兴奋— —代码居然能够这样写!然后随着不断的学习,也慢慢的对IOC框架和注解反射等东西有了一点简单的了解。之前的一篇文章简单的介绍了一下Java的反射机制。今天的文章。就完毕一个简单的,基于IOC的小Demo。让大家慢慢的对IOC有一点简单的了解。
首先。什么是IOC呢?
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。也是轻量级的Spring框架的核心。 控制反转一般分为两种类型。依赖注入(Dependency Injection,简称DI)和依赖查找。
依赖注入应用比較广泛。
我们以下要完毕的。就是Android中依赖注入的实现。
首先,看我们的项目结构
结构非常easy,一个基类。一个子类,一个自己定义凝视类型。一个布局文件。
以下看代码的详细实现
首先看最重要的基类
BaseActivity.java
package com.example.iocdemo; import java.lang.reflect.Field; import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast; public class BaseActivity extends Activity { protected Context mContext = this; /**
* 实现IOC注入
*
* @param baseActivity
*/
public void initInjectedView(Object baseActivity) {
// 获取全部的成员变量
Field[] fields = baseActivity.getClass().getDeclaredFields();
if (fields != null && fields.length > 0) {
// 遍历成员变量
for (Field field : fields) {
try {
// 抑制权限检查
field.setAccessible(true);
// 获取成员变量的凝视类
ViewInject viewInject = field
.getAnnotation(ViewInject.class);
// 假设凝视类不为空,即成员变量是使用凝视的方式进行声明的
if (viewInject != null) {
// 获取凝视中的id
int id = viewInject.id();
// 设置字段值
field.set(this,
((Activity) baseActivity).findViewById(id));
// 将实例化好的View对象取出
View view = (View) field.get(this);
// 绑定监听事件
view.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(mContext, "别点人家吖!",
Toast.LENGTH_SHORT).show();
}
});
} } catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
在这个类里面。我们完毕了IOC注入方法的编写,自己定义的凝视类型代码例如以下:
package com.example.iocdemo; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
public int id();
}
@Target(ElementType.FIELD)这句代码实现的是控制凝视的位置为字段,或者说是成员变量。由于我们要完毕的是控件的凝视。和时间绑定。因此,我们设置为ElementType.FIELD就能够。
@Retention是一个enum类型,共同拥有三个值。各自是SOURCE,CLASS 和 RUNTIME.。
SOURCE代表的是这个Annotation类型的信息仅仅会保留在程序源代码里,源代码假设经过了编译之后。Annotation的数据就会消失,并不会保留在编译好的.class文件中面。
ClASS的意思是这个Annotation类型的信息保留在程序源代码里,同一时候也会保留在编译好的.class文件中面,在运行的时候,并不会把这一些信息载入到虚拟机(JVM)中去.注意一下。当你没有设定一个Annotation类型的Retention值时。系统默认值是CLASS.
RUNTIME,表示在源代码、编译好的.class文件里保留信息,在运行的时候会把这一些信息载入到JVM中去的。
由于我们须要在JVM把我们的class文件载入进入之后,完毕注入,因此,我们选择这个属性。
好了,如今我们知道怎样简单的定义一个自己定义的凝视类型,而且用代码实现了代码注入和事件绑定,以下,我们看一下在我们的程序中,怎样使用。
以下是我们在Activity的代码
package com.example.iocdemo; import android.os.Bundle;
import android.widget.Button; public class MainActivity extends BaseActivity { //用凝视进行控件的初始化
@ViewInject(id = R.id.btn)
Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//进行注入
initInjectedView(this);
} }
以下是我们的执行结果
【Android开发经验】来,咱们自己写一个Android的IOC框架!的更多相关文章
- 写一个Android输入法01——最简步骤
本文演示用Android Studio写一个最简单的输入法.界面和交互都很简陋,只为剔肉留骨,彰显写一个Android输入法的要点. 1.打开Android Studio创建项目,该项目和普通APP的 ...
- 为PhoneGap写一个android插件
为PhoneGap写一个android插件,要怎么做? 其实这句话应该反过来说,为android写一个PhoneGap插件,要怎么做? 这里以最简单的Hello World!为例,做个说明: 1.第一 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- laravel学习:php写一个简单的ioc服务管理容器
php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...
- go server框架学习之路 - 写一个自己的go框架
go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...
- Summer——从头开始写一个简易的Spring框架
Summer--从头开始写一个简易的Spring框架 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...
- 动手写一个简单的Web框架(模板渲染)
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
随机推荐
- cocos2d-x截图功能clippingnode它也可用于——白费
许多其他精彩分享:http://blog.csdn.net/u010229677 3.1版本号: 在Director数: bool Director::saveScreenshot(const std ...
- linux free
在Linux下查看内存我们一般用command free [root@nonamelinux ~]# free total used free s ...
- 漂亮的表格样式(使用CSS样式表控制表格样式)
根据WEB2.0风格,设计了几个表格样式,我希望你喜欢. WEB2.0推广使用div开放式布局.但并不是完全放弃使用形式,在数据表现形式而言是一个不错的选择. 本节将介绍如何使用现在CSS样式表来控制 ...
- C语言程序代写(QQ:928900200)
1.学生成绩统计 要求描述: 用结构数组实现学生信息的统计功能. struct student { long no; /*学号*/ char name[10]; /*姓名*/ char sex; /* ...
- Android 4.0新组件:GridLayout详细说明
于Android 4.0(API 14)它提供了一个新的组件GridLayout,它继承自Linearlayout,用于执行网络格样式布局. 在某些方面,GridLayout与TableLayout和 ...
- UDP议定书图像高速传输无损失程序
下面的程序实现UDP没有图像数据的高速传输协议损耗,测试数据egtest01图片库,实现PC和图像的传输嵌入式结束.变速箱+读写速度可以达到10+M/S.考 server端程序 #include &l ...
- 3D MAX脚本教程1
本文转载自http://jiurong995294.blog.163.com/blog/static/195133243201192531546490/ 方便以后须要时候使用 为什么要学习3D MAX ...
- C3P0在多线程下的maxPoolSize配置
ETL工具完毕的差点儿相同了.今天遇到一个问题.就是给C3P0配置了maxPoolSize为10.目的是想让整个应用同一时候获得的最大的Connection个数为10,可是在測试应用的这一部分之后,发 ...
- 光谱郑匡移动互联网O2O完美融合
移动互联网尽管市场颇大,前景广阔,可是由于数据过于密集,非常难精准的定位所谓的目标客户群,然而O2O的线下市场却与互联网市场有极大的反差.一直认为高校周边的小商家是最幸福的生意人,客户明白(就是本校学 ...
- HDU 2815 Mod Tree 离散对数 扩张Baby Step Giant Step算法
联系:http://acm.hdu.edu.cn/showproblem.php?pid=2815 意甲冠军: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...