zoukankan      html  css  js  c++  java
  • Android RoboGuice 使用指南

    1.概述

      在开发应用时一个基本原则是模块化,并且近最大可能性地降低模块之间的耦合性。在Java平台上Spring Framework 以及.Net 平台 CAB ,SCSFPrism (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库来完成。

    好了,介绍了这么多就让我们来看一个实例来看一下RoboGuice在Android上的用法。

    1.下载RoboGuice2.0guice-3.0-no_aop

    2.新建工程将两个文件放入libs目录下

    3.在MainActivity布局内添加一个Button和TextView

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="为TextView设值" />
    
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    public class MainActivity extends Activity {
    
        private Button btn;
        private TextView tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn = (Button) findViewById(R.id.btn);
            tv = (TextView) findViewById(R.id.tv);
            btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    tv.setText("hello roboguice");
                }
            });
        }
    
    }

    下面我们就使用RoboGuice对代码进行改进

    /**
     * @author malinkang
     * 
     *         需要注意的是,使用RoboGuice这套依赖注入的框架,MainActivity不在是继承Activity,
     *         而是继承RoboActivity.什么?你问为什么?为什么?这就跟为什么Android上的Activity界面
     *         必须要继承自Activity一样.
     */
    
    public class MainActivity extends RoboActivity {
    
        @InjectView(R.id.btn)
        private Button btn;
        @InjectView(R.id.tv)
        private TextView tv;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    tv.setText("hello roboguice");
                }
            });
        }
    
    }

    是不是代码简洁多了。

    2.RoboGuice功能介绍

    Roboguice是基本Android和Google Guice开发的适用于Android平台的Dependency Injection 开发包,下图为使用Roboguice开发应用的基本框图:

      Android应用程序可以直接使用Google Guice来为普通类进行注入操作,而对和Android平台相关的类如Activity,Context,Service,View等可以使用Roboguice 进行注入操作。

      在上面的例子中我们介绍了使用RoboGuice开发的步骤,原先从Activity派生的类一般需要改成从RoboActivity派生,并添加从RoboApplication派生的类作为Application应用的Application类,详细的对应表如下:

    RoboGuice支持的标记如下:

    • @ContextScoped : 表示Scope为Context 范围
    • @InjectExtra :  Intent的getExtra 的注入标记
    • @InjectPreference: 注入Preference
    • @InjectResource: 注入Resource,如drawable, icon 等
    • @InjectView:  注入View
    • @Inject:  Guice标记,可以注入Android平台支持的各种服务,比如LocationManager等。
    • @SharedPreferencesName: SharedPreferences  名称等

    此外,RoboGuice还提供了简单的消息publish/subscribe 机制,以及可以支持Dependency Injection的RoboThread, RoboAsyncTask ,RoboLooperThread 等。

       我们将在下文中介绍这些标记的用法,@InjectView在上文例子中已经介绍,用法比较简单就不做过多介绍了。

    参考

    http://blog.csdn.net/mapdigit/article/details/7724194

  • 相关阅读:
    java——ArrayList中remove()方法疑问总结
    java——ArrayList中contains()方法中的疑问
    C语言中signed和unsigned理解
    IO流——常用IO流详解
    Lost's revenge
    Searching the String
    DNA repair
    Ring
    Wireless Password
    Censored!
  • 原文地址:https://www.cnblogs.com/malinkang/p/3296872.html
Copyright © 2011-2022 走看看