Android RoboGuice 使用指南(1):概述

来源:互联网 发布:灌砂法压实度试验算法 编辑:程序博客网 时间:2024/05/22 15:48

在开发应用时一个基本原则是模块化,并且近最大可能性地降低模块之间的耦合性。在Java平台上Spring Framework 以及.Net 平台CAB ,SCSF 和Prism(WPF,Silverlight)中都有对Dependency injection 的支持。

Dependency injection 大大降低了类之间的依赖性,可以通过annotation (Java)或是SeviceDepdendcy (.Net) 描述类之间的依赖性,避免了直接调用类似的构造函数或是使用Factory来参加所需的类,从而降低类或模块之间的耦合性,以提高代码重用并增强代码的可维护性。

Google Guice提供了Java平台上一个轻量级的 Dependency injection 框架,并可以支持开发Android应用。本指南将使用Android平台来说明Google Guice的用法。

简单的来说:Guice 降低了Java代码中使用 new 和 Factory函数的调用。可以把Guice 的@Inject 看作 new 的一个替代品。使用Guice可能还需要写一些Factory方法,但你的代码不会依赖这些Factory方法来创建实例。 使用Guice 修改代码,单元测试已经代码重用变得更容易。

RoboGuice 为Android平台上基于Google Guice开发的一个库,可以大大简化Android应用开发的代码和一些繁琐重复的代码。比如代码中可能需要大量使用findViewById在XML中查找一个View,并将其强制转换到所需类型,onCreate 中可能有大量的类似代码。RoboGuice 允许使用annotation 的方式来描述id于View之间的关系,其余的工作由roboGuice库来完成。比如:

[java] view plaincopyprint?
  1. class AndroidWay extends Activity {  
  2.  TextView name;  
  3.  ImageView thumbnail;  
  4.  LocationManager loc;  
  5.  Drawable icon;  
  6.  String myName;  
  7.    
  8.  public void onCreate(Bundle savedInstanceState) {  
  9.  super.onCreate(savedInstanceState);  
  10.  setContentView(R.layout.main);  
  11.  name      = (TextView) findViewById(R.id.name);  
  12.  thumbnail = (ImageView) findViewById(R.id.thumbnail);  
  13.  loc       = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);  
  14.  icon      = getResources().getDrawable(R.drawable.icon);  
  15.  myName    = getString(R.string.app_name);  
  16.  name.setText( "Hello, " + myName );  
  17.  }  
  18. }  


如果使用roboguice 来写:

[java] view plaincopyprint?
  1. class RoboWay extends RoboActivity {  
  2.  @InjectView(R.id.name)             TextView name;  
  3.  @InjectView(R.id.thumbnail)        ImageView thumbnail;  
  4.  @InjectResource(R.drawable.icon)   Drawable icon;  
  5.  @InjectResource(R.string.app_name) String myName;  
  6.  @Inject                            LocationManager loc;  
  7.    
  8.  public void onCreate(Bundle savedInstanceState) {  
  9.  super.onCreate(savedInstanceState);  
  10.  setContentView(R.layout.main);  
  11.  name.setText( "Hello, " + myName );  
  12.  }  
  13. }  

    如果使用roboguice 来写:

    [java] view plaincopyprint?
    1. class RoboWay extends RoboActivity {  
    2.  @InjectView(R.id.name)             TextView name;  
    3.  @InjectView(R.id.thumbnail)        ImageView thumbnail;  
    4.  @InjectResource(R.drawable.icon)   Drawable icon;  
    5.  @InjectResource(R.string.app_name) String myName;  
    6.  @Inject                            LocationManager loc;  
    7.    
    8.  public void onCreate(Bundle savedInstanceState) {  
    9.  super.onCreate(savedInstanceState);  
    10.  setContentView(R.layout.main);  
    11.  name.setText( "Hello, " + myName );  
    12.  }  
    13. }  
0 0
原创粉丝点击