Android RoboGuice2 使用指南(2): 第一個例子Hello World

下載新的RoboGuice庫,Roboguice2.0 庫有四個庫組成,如下圖所示:
2. 創建一個新Android項目,比如GuiceDemo,目標平臺Android1.5以上。

3. 一般可以在該項目下添加一個libs目錄,將兩個jar文件拷到libs目錄下,然後通過: Project > Properties > Java Build Path > Libraries > Add JARs

 

註:從ADT17開始,添加的jar文件需放在libs 子目錄下,可以參見升級到ADT 17 出現dalvikvm: Unable to resolve superclass的問題

添加瞭對應guice 和roboguice庫的引用之後,就可以開始編寫第一個使用roboguice2 的例子。

使用roboguice2 的步驟:

Roboguice2 中不在含有RoboApplication 類,因此無需也不可能派生RoboApplication的子類。這裡重復一下HelloWorld 的Layout 和類說明

1. 在這個簡單的例子中,它使用的Layout 定義如下:

<?xml version=”1.0″ encoding=”utf-8″?>
< LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<TextView
android:id=”@+id/hello”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/hello”
/>
< /LinearLayout>
我們定義瞭一個TextView ,它的id為hello.

假定這個應用使用一個IGreetingService ,它有一個方法getGreeting() 返回一個字符串,至於IGreetingService 如何實現,GuideDemo 不需要關心。

 

Dependency injection 設計模式的一個核心原則為: Separate behavior from dependency resolution. 也就說將應用需要實現的功能和其所依賴的服務或其它對象分離。 對本例來說GuiceDemo隻要知道它依賴於IGreetingService 服務,至於IGreetingService有誰實現GuiceDemo並不需要知道。

在Roboguice 中使用@Inject 來表示這種依賴關系。

[java] 
public class GuiceDemo extends RoboActivity  { 
  
 @InjectView (R.id.hello) TextView helloLabel; 
 @Inject IGreetingService greetingServce; 
  
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 helloLabel.setText(greetingServce.getGreetings()); 
 } 

public class GuiceDemo extends RoboActivity  {
 
 @InjectView (R.id.hello) TextView helloLabel;
 @Inject IGreetingService greetingServce;
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 helloLabel.setText(greetingServce.getGreetings());
 }
}
使用RoboGuice 的Activity需要從RoboActivity派生(RoboActivity為Activity的子類).
使用@Inject標註greetingServce依賴於IGreetingService服務
使用@InjectView表示helloLabel 依賴於R.id.hello (XML)
代碼中沒有創建greetingServce 對象的代碼(如 new xxx()) 和為helloLabel 賦值的代碼。這些值都可以Roboguice 自動創建和賦值註入(Inject)到變量中。

為瞭說明問題,我們在代碼中添加兩個對getGreetings的實現,一個為HelloWorld, 一個為HelloChina:

[java] 
public class HelloChina implements IGreetingService{ 
  
 @Override 
 public String getGreetings() { 
 return "Hello,China"; 
 } 
  

  
public class HelloWorld implements IGreetingService{ 
  
 @Override 
 public String getGreetings() { 
 return "Hello,World"; 
 } 
  

public class HelloChina implements IGreetingService{
 
 @Override
 public String getGreetings() {
 return "Hello,China";
 }
 
}
 
public class HelloWorld implements IGreetingService{
 
 @Override
 public String getGreetings() {
 return "Hello,World";
 }
 
}
2. 到這裡,你可能有些困惑,RoboGuice怎麼知道使用那個類(HelloWorld或是HelloChina)為GuiceDemo中的greetingServce 賦值呢?這是通過在Module 中定義binding 來實現的。

在項目中添加一個GreetingModule (從AbstractModule 派生而非AbstractAndroidModule類)重載configure方法:

[java] 
public class GreetingModule extends AbstractAndroidModule{ 
  
@Override 
protected void configure() { 
bind(IGreetingService.class).to(HelloWorld.class); 
//bind(IGreetingService.class).to(HelloChina.class);  
  

  

public class GreetingModule extends AbstractAndroidModule{
 
@Override
protected void configure() {
bind(IGreetingService.class).to(HelloWorld.class);
//bind(IGreetingService.class).to(HelloChina.class);
 
}
 
}
將IGreetingService 綁定到HelloWorld 類。

3. 在res/values/roboguice.xml 定義Module

[html] view plaincopyprint?
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="roboguice_modules"> 
        <item>com.pstreets.guice.demo.GreetingModule</item> 
    </string-array> 
</resources> 
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="roboguice_modules">
        <item>com.pstreets.guice.demo.GreetingModule</item>
    </string-array>
</resources>
可以將GreetingModule 綁定改為HelloChina ,對比一下:

 

通過改變binding ,GuiceDemo 顯示瞭不同的結果,GuiceDemo不依賴於具體的實現,可以非常方便的改變接口的實現而無需更改GuiceDemo的代碼。大大降低瞭類於類之間的耦合性。

 作者:mapdigit
 

發佈留言