首页 > 代码库 > FinalActivity的简要介绍与使用

FinalActivity的简要介绍与使用

之前的两篇文章介绍了AFinal框架下的图片加载与网络通信的部分,这篇文章主要简单介绍FinalActivity的使用。

首先,FinalActivity是基于IOC机制,通过依赖注入的方式完成控件的id绑定与事件绑定,从而实现代码量的精简。下面是FinalActivity的最简单的使用

public class MainActivity extends FinalActivity {

	@ViewInject(id = R.id.btn, click = "click")
	Button btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void click(View v) {
		Toast.makeText(this, "被点击了", Toast.LENGTH_SHORT).show();
	}

}

首先,我们肯定要继承FinalActivity,然后,我们就可以采用注释的方式,完成事件的绑定和id的绑定操作,所以说,这种方式可以大大的减少我们的代码量,让代码看起来更加的简洁。

我们可以查看FinalActivity的源代码

public void setContentView(int layoutResID) {
		super.setContentView(layoutResID);
		initInjectedView(this);
	}


	public void setContentView(View view, LayoutParams params) {
		super.setContentView(view, params);
		initInjectedView(this);
	}


	public void setContentView(View view) {
		super.setContentView(view);
		initInjectedView(this);
	}

FinalActivity重写了setContentView这个方法,所以当我们调用setContent方法的时候,就会完成注入的操作。

public static void initInjectedView(Object injectedSource,View sourceView){
		Field[] fields = injectedSource.getClass().getDeclaredFields();
		if(fields!=null && fields.length>0){
			for(Field field : fields){
				try {
					field.setAccessible(true);
					
					if(field.get(injectedSource)!= null )
						continue;
				
					ViewInject viewInject = field.getAnnotation(ViewInject.class);
					if(viewInject!=null){
						
						int viewId = viewInject.id();
					    field.set(injectedSource,sourceView.findViewById(viewId));
					
					    setListener(injectedSource,field,viewInject.click(),Method.Click);
						setListener(injectedSource,field,viewInject.longClick(),Method.LongClick);
						setListener(injectedSource,field,viewInject.itemClick(),Method.ItemClick);
						setListener(injectedSource,field,viewInject.itemLongClick(),Method.itemLongClick);
						
						Select select = viewInject.select();
						if(!TextUtils.isEmpty(select.selected())){
							setViewSelectListener(injectedSource,field,select.selected(),select.noSelected());
						}
						
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
在这个方法中,主要完成对注释的扫描,并且将使用注释方式添加事件的控件,进行了点击事件的添加。

IoC中最基本的Java技术就是“反射”编程。反射又是一个生涩的名词,通俗的说反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让对象在生成时才决定要生成哪一种对象。反射的应用是很广泛的,象Hibernate、Spring中都是用“反射”做为最基本的技术手段。

虽然,这样会让代码量减少,但是,这样也带来一些缺点,最主要的就是使用反射技术,会使得对象的创建变慢,但经SUN改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。因此,我们在选择使用哪种方式的时候,还是要权衡一下的。