关注finddreams,一起学习,一起进步:http://blog.csdn.net/finddreams/article/details/45504133
现在做移动端开发的开发者,不管是Android和IOS,公司一般都是喜欢那种具备独立开发能力的人,因为APP项目相对较小,有时候一个人完全可以单独胜任一个项目。所以如果我们要能够具备独立开发的能力,快速敏捷开发是我们所必须要去思考的事情,毕竟一个人做APP所要做的事情还是挺多的,为了项目的如期上线,我们需要用到各种第三方的库和框架,这样可以做出漂亮的 UI 界面、让代码变得整洁,提高我们的开发效率等等。
依赖注入是一种软件设计模式,无论是在运行时还是在编译时,允许删除、改变硬编码依赖性。
这里随便说一下JavaEE开发的SSH三大框架中有一个概念叫做IOC——控制反转:说的是创建对象的实例控制权从代码控制剥离到IOC容器控制,实际上就是我们在xml文件中进行控制,比如说Spring控件。通俗的来讲,就是以前创建实例对象是需要程序员主动的去调用,才能去执行,但控制反转是交给容器自动的去调用执行。其实Android本身也是基于IOC的机制。
了解完概念之后,我们来看看目前常用的几个DI框架有哪些?
从图中可以看出对于依赖注入框架有三种,一种是类的注入,像Dagger;一种是视图注入,很有名的Butter Knife;还有一种是比较综合性的,有RoboGuice,AndroidAnnotations。Dragger这个框架使用起来相对会比较麻烦,这里暂时不做介绍,下面就来比较一下其他三个框架,看看你适合用哪一个?
先来看看我们没有使用任何依赖注入框架之前的写法:
class ExampleActivity extends Activity {
TextView title;
TextView subtitle;
TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
title = (TextView) findViewById(R.id.title);
subtitle = (TextView) findViewById(R.id.subtitle);
footer = (TextView) findViewById(R.id.footer);
// TODO Use views...
}
看完最原生的写法之后,接下我们分别看看使用依赖注入框架之后的写法,看看是不是简单快速了很多。
这是github上的一个大牛Jake Wharton开发的视图注入框架,目的是为了使开发人员尽可能少的编写代码。
官网地址:http://jakewharton.github.io/butterknife/
使用ButterKnife框架之后我们冲写上面的代码来看看是不是简单了很多,再也不用重复的写findViewById()方法了。
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
}
不过在使用ButterKnife.jar包时有一个地方需要注意的,需要配置Annotation Procession,不然可能会报空指针异常。
方法:1、鼠标对准需要注解的项目,单击右键 poperties –>java Compiler –>
2、Annotation Procession –> 钩一下 Enable project specific settings 其它的就会自动钩上了
3、–> Factory Path ( 钩一下Enable project specific settings )–> 最后Add …. JARs 把刚刚下载的jar包来。这样ButterKnife配置还才可以使用。
可能有些同学的Eclipse点击项目右键Poperties,JavaCompiler中没有Annotation Procession这一选项,这时你需要配置插件,安装即可:http://download.eclipse.org/releases/juno 如图:
ButterKnife还有很多其他有用的功能,具体用法可以去官网详细了解。
AndroidAnnotations是一个能够让你快速进行Android开发的开源框架,它可以使代码更加精简,使项目更加容易维护,它的目标就是“Fast Android Development.Easy maintainance”。
使用这个框架可以比原生简化至少一半的代码量。
GitHub 地址:https://github.com/excilys/androidannotations
特性:
1、使用依赖注入(Dependency Injection)
2、简化的线程模型(Simplified threading model)
3、事件绑定(Event binding)
4、REST Client
5、No Magic [不知道为什么这样称呼,直译过来就是:无魔法,它的意思是:AndroidAnnotations在编译
的时候会产生一个子类(接下来你会明白),你查看这个子类,可以看到它是如何工作的]
代码如下:
import android.app.Activity;
import android.widget.EditText;
import android.widget.TextView;
import com.googlecode.androidannotations.annotations.Click;
import com.googlecode.androidannotations.annotations.EActivity;
import com.googlecode.androidannotations.annotations.ViewById;
@EActivity(R.layout.main)
public class MyActivity extends Activity {
@ViewById(R.id.myInput)
EditText myInput;
@ViewById(R.id.myTextView)
TextView textView;
@Click
void myButton() {
String name = myInput.getText().toString();
textView.setText("finddreams"+name);
}
}
注意:使用AndroidAnnotations千万要记得,编译的时候会生成一个子类,这个子类的名称就是在原来的类之后加了一个下划线“”,比如这个例子产生的子类名称为“MyActivity”,这就需要你在注册这个Activity的时候,在AndroidManifest.xml中将 MyActivity 改为 MyActivity_ ,使用的时候也是使用MyActivity_来表示此类。
如从另一个Activity跳转startActivity(new Intent(this,MyActivity_.class));注意,是MyActivity_.class 不是 MyActivity.class;
AndroidAnnotations是一个非常强大的快速开发框架,深入的了解好怎么使用对于提高我们的开发效率是非常有用的。这里就不做详细的介绍。
Roboguice 是一个用于 Android 应用的依赖注入框架,使用 Google 官方的 Guice 库位极大地简化了 Android 的依赖注入。让你的 Android 应用开发之路更加平坦顺利,编程更加简单有趣。
通过使用 RoboGuice,你可以注入 View 视图控件、资源、系统服务或者其他任何对象。RoboGuice 能帮你精简应用程序的代码。代码越少意味着出现问题或 bug 的次数也就越少,从而可以把更多的精力花在项目中那些需要编写或修改的部分,使得阅读代码更加容易。
使用 RoboGuice 库 :
1.控件注入:用@InjectViews 方法初始化控件,例如:@InjectView(R.id.textview1)TextView textView1。
2.资源注入:用@InjectResources 方法初始化资源,例如:@InjectResource(R.string.app_name)String name。
3.系统服务注入:用@Inject 方法初始化并获取系统服务,例如:@Inject LayoutInflater inflater。
4.POJO 对象注入:用@Inject 方法注入并初始化 POJO 对象,例如:@Inject Foo foo。
使用 RoboGuice
你先要继承 RoboActivity 或者 RoboFragment,才能使用 RoboGuice 的依赖注入功能。
public class TestActivity extends RoboActivity{
@InjectView (R.id.textView1) TextView textView1;
@InjectView (R.id.textView2) TextView textView2;
@InjectView (R.id.imageView1) ImageView imageView1;
@InjectResource (R.string.app_name) String name;
@InjectResource (R.drawable.ic_launcher) Drawable icLauncher;
@Inject LocationManager locManager;
@Inject LayoutInflater inflater;
@Inject NotificationManager notifyManager;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.layout_test);
textView1.setText (name);
}
}
使用 RoboGuice 的好处
不需要初始化控件,如有需要就用@InjectViews。
不需要初始化系统服务,如有需要就用@Inject。
不需要初始化像 Drawable,string 以及其他的资源,如有需要就用@InjectResource。
以上实践能帮助你精简代码。
越少的代码,越少的问题和 bugs。
少量的代码让 Android 开发人员省力同时,也让他们能更专注于实际的业务逻辑。
就像咱们程序员常说C和C++运行快,Java,PHP运行慢,那是因为这些语言为了更加有利于开发者学习和维护牺牲了一些性能,但这些牺牲还是值得的。
最好,我想说学习使用任何一个依赖注入类库都是一个不错的选择,因为这将大大的提高你的开发速度,真正的让你具备快速独立开发APP的能力。