Android快速开发必备——依赖注入(DI)类库的选择ButterKnife,AndroidAnnotations,RoboGuice

  关注finddreams,一起学习,一起进步:http://blog.csdn.net/finddreams/article/details/45504133

  

  现在做移动端开发的开发者,不管是Android和IOS,公司一般都是喜欢那种具备独立开发能力的人,因为APP项目相对较小,有时候一个人完全可以单独胜任一个项目。所以如果我们要能够具备独立开发的能力,快速敏捷开发是我们所必须要去思考的事情,毕竟一个人做APP所要做的事情还是挺多的,为了项目的如期上线,我们需要用到各种第三方的库和框架,这样可以做出漂亮的 UI 界面、让代码变得整洁,提高我们的开发效率等等。

 

1.什么是依赖注入(DI)?

  依赖注入是一种软件设计模式,无论是在运行时还是在编译时,允许删除、改变硬编码依赖性。

  这里随便说一下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...
  }

  看完最原生的写法之后,接下我们分别看看使用依赖注入框架之后的写法,看看是不是简单快速了很多。

  

  

2.ButterKnife

  这是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还有很多其他有用的功能,具体用法可以去官网详细了解。

3.AndroidAnnotations

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是一个非常强大的快速开发框架,深入的了解好怎么使用对于提高我们的开发效率是非常有用的。这里就不做详细的介绍。

4.Roboguice

  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的能力。

   

 

时间: 2024-08-24 00:41:31

Android快速开发必备——依赖注入(DI)类库的选择ButterKnife,AndroidAnnotations,RoboGuice的相关文章

话说 依赖注入(DI) or 控制反转(IoC)

首页 下载 扩展 应用 教程 代码 案例 资讯 讨论 全部 搜索 话说 依赖注入(DI) or 控制反转(IoC) 浏览:3641 发布日期:2014/03/20 分类:技术分享 科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些力量. 首先先别追究这个设计模式的定义,否则你一定会被说的云里雾里,笔者就是深受其害,百度了N多文章,都是从理论角度来描

UltimateAndroid快速开发框架简介与教程(也是一套Android快速开发的教程)

UltimateAndroid是一套集成了许多现有优秀的Android开源类库并将之组合成一个整体的Android快速开发框架. github地址:https://github.com/cymcsg/UltimateAndroid 框架目前主要包含的功能有View Injection,ORM,异步网络请求和图片加载,自动化脚本测试,磁盘LRU等功能.同时提供了类似于TripleDes.Webview快速设置.Md5处理.String处理,Https处理等常用工具类,还有多种UI控件效果.并且这些

NET Core开发-获取所有注入(DI)服务

NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Controller,或者在ASP.NET Core程序中的其他地方使用注入的服务,如logging 等. 我们要怎样获取ASP.NET Core中所有注入(DI)服务呢,下面我们来一探究竟, 也可以来看看ASP.NET Core到底注入了哪些服务. 依赖注入简单介绍: 依赖注入(Dependency in

控制反转IOC与依赖注入DI

1. IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针.分针和秒针顺时针旋转,从而在表盘上产生正确的时间.图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务.我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组

控制反转(Ioc)和依赖注入(DI)

控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基于接口的开发,那么在实现中必须面临最终是有“谁”提供实体类的问题.(将各层的对象以松耦合的方式组织起来,各层对象的调用面向接口.) 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例. 然后,采用依赖注入原则,创建被调用者的实例的工作不再由调用者完成,而

AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step-5 #切换分支 npm start #启动项目 2.什么是XHR和依赖注入(Dependency Injection)? 1)什么是XHR? XHR是XMLHttpRequest的简称,XMLHttpRequest 用于在后台与服务器交换数据,主要是为了实现在不重新加载整个网页的情况下,对网页的某部分进行更新.简单说,浏览器中URL

控制反转IOC与依赖注入DI - 理论篇

学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现,毕竟是之前的好同事,好朋友,我也就抽时间百度了很多资料 在查阅网上资料的过程中,我发现大多技术篇幅都是IOC的代码实现,并没有一篇介绍IOC理论的篇幅!这显然不是我想要的. 我知道要想搞明白IOC,就必须要弄明白什么是IOC(控制反转)?为什么叫IOC(控制反转)?为什么之后又可以称为DI(依赖注

.NET Core开发日志——依赖注入

依赖注入(DI)不是一个新的话题,它的出现是伴随着系统解耦的需要而几乎必然产生的. 在SOLID设计原则中,DIP(Dependency inversion principle)--依赖倒置,规定了"需依赖抽象,而非实现"的准则,该原则主要目的是通过引入抽象(比如接口)的方式降低模块之间的耦合性.与此原则相拟而又有所不同的是IoC(inversion of control)--控制反转设计原则.这项原则定义了应该由通用框架而非外部代码决定控制流(control flow)的概念.对控制

浅析Spring IOC、依赖注入(DI)和依赖查找(DL)

为什么要用IOC? 第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这是一件非常头疼的事. 第二:解耦,由容器去维护具体的对象 第三:托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分过程交给容器,应用程序则无需去关心类是如何完成代理的 控制反转(Inverse of Control) 控制反转即IoC(Incersion of Control),从字面上理解就是控制反转,将对在自身对象中的一个