Android RoboGuice 使用指南(1):概述
在开发应用时一个基本原则是模块化,并且近最大可能性地降低模块之间的耦合性。在Java平台上SpringFramework以及.Net平台CAB,SCSF和Prism(WPF,Silverlight)中都有对Dependencyinjection的支持。
Dependencyinjection大大降低了类之间的依赖性,可以通过annotation(Java)或是SeviceDepdendcy(.Net)描述类之间的依赖性,避免了直接调用类似的构造函数或是使用Factory来参加所需的类,从而降低类或模块之间的耦合性,以提高代码重用并增强代码的可维护性。
GoogleGuice提供了Java平台上一个轻量级的Dependencyinjection框架,并可以支持开发Android应用。本指南将使用Android平台来说明GoogleGuice的用法。
简单的来说:Guice降低了Java代码中使用new和Factory函数的调用。可以把Guice的@Inject看作new的一个替代品。使用Guice可能还需要写一些Factory方法,但你的代码不会依赖这些Factory方法来创建实例。使用Guice修改代码,单元测试已经代码重用变得更容易。
RoboGuice为Android平台上基于GoogleGuice开发的一个库,可以大大简化Android应用开发的代码和一些繁琐重复的代码。比如代码中可能需要大量使用findViewById在XML中查找一个View,并将其强制转换到所需类型,onCreate中可能有大量的类似代码。RoboGuice允许使用annotation的方式来描述id于View之间的关系,其余的工作由roboGuice库来完成。比如:
class AndroidWay extends Activity { TextView name; ImageView thumbnail; LocationManager loc; Drawable icon; String myName; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name = (TextView) findViewById(R.id.name); thumbnail = (ImageView) findViewById(R.id.thumbnail); loc = (LocationManager) getSystemService(Activity.LOCATION_SERVICE); icon = getResources().getDrawable(R.drawable.icon); myName = getString(R.string.app_name); name.setText( "Hello, " + myName ); } }
如果使用roboguice来写:
class RoboWay extends RoboActivity { @InjectView(R.id.name) TextView name; @InjectView(R.id.thumbnail) ImageView thumbnail; @InjectResource(R.drawable.icon) Drawable icon; @InjectResource(R.string.app_name) String myName; @Inject LocationManager loc; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); name.setText( "Hello, " + myName ); } }
只需使用@InjectView来描述view和Id之间的关系,RoboGuice自动完成余下的工作,代码简洁易读。在介绍完GoogleGuice,再接着介绍RoboGuice在Android平台上使用方法。