zoukankan      html  css  js  c++  java
  • 【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);
    	}
    
    }

    以下是我们的执行结果


  • 相关阅读:
    KPConv针对Modelnet40的分类
    《天净沙·秋思》
    ubuntu16.04matlab中文注释乱码的解决办法
    八月六日,晴
    Deformable Convolutional Networks
    卷积核filter和kernal的区别
    木心/《眉目》
    人生若只如初见,何事秋风悲画扇
    c++从文件路径获取目录
    ICCV2019《KPConv: Flexible and Deformable Convolution for Point Clouds》
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5074863.html
Copyright © 2011-2022 走看看