之前的两篇文章介绍了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改良优化后,反射方式生成对象和通常对象生成方式,速度已经相差不大了(但依然有一倍以上的差距)。因此,我们在选择使用哪种方式的时候,还是要权衡一下的。
FinalActivity的简要介绍与使用,布布扣,bubuko.com
时间: 2024-10-19 00:22:09