支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索

博主:初学MPEG

初学MPEG 本博客-采用Python的web框架Django与Mysql数据库,致力于对Python、Django的了解 与研究
Django技术QQ群:XXXXXXX
Python技术QQ群:XXXXXXX

分类

关键字

本站最新博文

友情链接  

[转]Android RoboGuice 1.1 使用指南(2):第一個例子Hello World

类别:Android 状态:游客可见,可回,会员可关联(没审核) 阅读:3576 评论:0 时间:五月 11, 2014, 11:36 a.m.
关键字:Android RoboGuice

 来源:http://www.imobilebbs.com/wordpress/archives/2486

首先介紹一下如果將Guice 和RoboGuice 的庫添加到項目中。

  1. 下載RoboGuiceguice-2.0-no_aop.jar(not guice-3.0),或者下載
  2. 創建一個新Android項目,比如GuiceDemo,目標平台Android1.5以上。
  3. 一般可以在該項目下添加一個lib目錄,將兩個jar文件拷到lib目錄下,然後通過: Project > Properties > Java Build Path > Libraries > Add External JARs

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

使用roboguice 的步驟:

1. 創建一個RoboApplication 的子類GuiceApplication,GuiceApplication為Appliacation的子類,因此需要修改AndroidManifest.xml,將Application 的name 指向這個類。可以參見Android簡明開發教程九:創建應用程序框架

<application android:name=”GuiceApplication”
android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.GuiceDemo”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>

</application>

2.  在這個簡單的例子中,它使用的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 來表示這種依賴關係。

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:

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

3. 到這裡,你可能有些困惑,RoboGuice怎麼知道使用那個類(HelloWorld或是HelloChina)為GuiceDemo中的greetingServce 賦值呢?這是通過在Module 中定義binding 來實現的。

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

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

將IGreetingService 綁定到HelloWorld 類。

然後在GuiceApplication 的addApplicationModules 添加上述模塊:

public class GuiceApplication extends RoboApplication {
 
 protected void addApplicationModules(List<Module> modules) {
 modules.add(new GreetingModule());
 }
 
}

可以將GreetingModule 綁定改為HelloChina ,對比一下:

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

後面將逐個介紹Guice和RoboGuice支持的Binding類型和用法(Guice)以及與android 平台相關的Dependency injection (RoboGuice)

相关博文 首页 上页 1 2 3 下页 尾页 共3条
操作:

Please Login (or Sign Up) to leave a comment