【六】注入框架RoboGuice使用:(Singletons And ContextSingletons)

上一篇我们简单的介绍了一下RoboGuice的使用(【五】注入框架RoboGuice使用:(Your First POJO Injection)),今天我们来看下单例以及上下文单例(ContextSingletons)使用注解的方法,从上一篇文章中相信大家对于普通Java对象(POJO)注解已经很熟悉了。

(一)概述:简要使用方法

①:创建继承RoboActivity的Activity类

②:使用@Inject进行注解POJO(普通Java对象)

③:使用@Singleton进行注解POJO类

(二)下面我们来实现一个单例注解

<span style="font-size:18px;">class MyActivity extends RoboActivity {
    @Inject Foo foo; // this will basically call new Foo();
}</span>

上面代码的例子中,我们知道每一次MyActivity实例没创建的时候,就会创建一个Foo新的实例。

如果我们现在使用@Singleton进行注解Foo类,RoboGuice就只会初始化一个Foo实例,并且是同样的实例。

<span style="font-size:18px;">@Singleton //a single instance of Foo is now used though the whole app
class Foo {
}</span>

在这种情况下

<pre name="code" class="java">new MyRoboActivity().foo = new MyRoboActivity().foo

(三)注意:当你使用@Singleton进行注解的时候,你会创建一个不被垃圾回收期收集的对象。当应用程序自身被销毁的时候该对象才会被销毁。即使你的Activity不适用它,只要应用还在运行着,该对象就会一直在内容中。正因为这个原因所以我们如果没有正确的时候它,就会可能出现内存泄露。针对这个情况,我们可以通过下面的上下文单例(ContextSingleton)来解决。

(四):Context Singletons

和@Singleton注解相比较,通过@ContextSingleton来注解创建的单例会根据Context(上下文)的生命周期,然后垃圾回收期(GC)进行回收。下面是使用方法:

@ContextSingleton //a single instance of Foo is now used per context
class Foo {
}

在上面的例子中,Foo会在Context范围弄有且只会创建一个实例。这就意味着两个MyActivity的实例会具有两个不同的Foo实例(与使用@Singleton注解相反,在这种情况下一个单例会在Activities中进行共享)。但是在同一个Context(上下文)中,Foo有且只会被实例化一次(与不适用@Singleton或者@ContextSingleton相反,这种情况下每次注解会创建一个不同Foo实例)。

详情请看:

public MyActivity extends RoboActivity {
  @Inject Foo foo;
  @Inject Bar bar;
}

public class Foo {
  @Inject Bar bar;
}

@ContextSingleton
public class Bar {
}

在这种情况下:

new MyRoboActivity().foo != new MyRoboActivity().foo
MyRoboActivity a = new MyRoboActivity();
a.bar == a.foo.bar

【注意】当你使用@ContextSingleton注解的时候,你创建的对象在给定的上下文生命周期中是不会被垃圾回收期回收。该会当上下文Context销毁的时候被销毁,但是如果你的Context没有使用到它,那么它还会存在内存中。也就是说如果你没有正确使用@ContextSingleton,该还是会出现内容泄露的情况。例如当我们在使用Fragments的时候。请看下面使用@FragmentSingleton。

(五):RoboGuice 3.0

RoboGuice 3.0版本新增了一个类FragmentScope.java,该范围会横跨整个Fragment的生命周期,在这范围内进行注解该会随着fragment生命周期存在,当fragment销毁的时候才会被销毁。

使用FragmentScope,我们同样可以定义单例。每一个FragmentSingleton会在FragmentScope中只会实例化一次。

public MyFragment extends RoboFragment {
  @Inject Foo foo;
  @Inject Bar bar;
}

public class Foo {
  @Inject Bar bar;
}

@FragmentSingleton
public class Bar {
}

在上面的情况下,每一个注解的字段:@Inject Foo foo,都会过的不同的foo实例对象。相反的所得@Inject Bar bar注解的,在相同的FragmentScope中只会获得相同的bar实例对象。

例如,在上面的例子中。

myFragment.bar = myFragment.foo.bar
new MyFragment().bar = new MyFragment().foo.bar
时间: 2024-10-17 12:23:36

【六】注入框架RoboGuice使用:(Singletons And ContextSingletons)的相关文章

【十四】注入框架RoboGuice使用总结

在我们平时开发Android项目的时候例如经常需要使用各种View控件,然后进行声明,findViewById,并且进行强转.每次都要写这样的代码就显得非常繁琐,并且容易出错哦.那么针对这种情况且不限定于以上的这类情况,Dependency injection 可以大大降低了类之间的依赖性,可以通过annotation (Java)描述类之间的依赖性,避免了直接调用类似的构造函数或是使用Factory来参加所需的类,从而降低类或模块之间的耦合性,以提高代码重用并增强代码的可维护性.Google

【七】注入框架RoboGuice使用:(Your First Custom Binding)

上一篇我们简单的介绍了一下RoboGuice的使用([六]注入框架RoboGuice使用:(Singletons And ContextSingletons)),今天我们来看下自己定义绑定(binding). (一):使用自己定义绑定.我们能够绑定一个类或者一个接口到一个子类.实例或者内容提供者(provinders). 如今我们如果: public interface IFoo {} public class Foo implements IFoo {} 该自己定义绑定同意绑定一个接口IFoo

【四】注入框架RoboGuice使用:(Your First System Service Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为了在Activity中系统服务使用注解,必须实现以下两个步骤: ①:创建继承RoboActivity的Activity ②:使用 @Inject来进行注解系统服务 下面我们来实现一个例子,和上一篇文章例子差不多,我们需要进行实现系统服务,我们同样创建一个继承RoboActivity的Activity

【十三】注入框架RoboGuice使用:(Logging via Ln)

上一篇我们简单的介绍了一下RoboGuice的使用([十二]注入框架RoboGuice使用:(Your First Injected ContentProvider)),今天我们来看下Log日志使用. Android应用通过会使用内置的android.util.log在Android控制台上面打印日志信息.RoboGuice也提供了另外的日志管理,你可能会想要使用. (一):  RoboGuice日志管理和通常的Log差不多,但也同样具备以下优点: ①:对于发布包来说,Debug and ver

【十】注入框架RoboGuice使用:(Your First Testcase)

上一篇我们简单的介绍了一下RoboGuice的使用([九]注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)),今天我们来看下测试用例(TestCase)的注入 RoboGuice使得我们更加容易实现可测试的Android应用程序,本文章就来详细解说下:当我们测试的时候,如何编写测试用例,已经从RoboGuice中获益.本文章使用Android Robolectric,适合大部分用Android标准测试的情况.

【五】注入框架RoboGuice使用:(Your First POJO Injection)

上一篇我们简单的介绍了一下RoboGuice的使用([四]注入框架RoboGuice使用:(Your First System Service Injection)),今天我们来看下普通Java对象的使用注解的方法: (一)为了在Activity中普通Java对象使用注解,必须实现以下两个步骤: ①:创建继承RoboActivity的Activity ②:使用 @Inject来进行注解POJO(普通java对象) 在前面我们介绍了View控件,资源文件(Resources),系统服务(Syste

【十二】注入框架RoboGuice使用:(Your First Injected ContentProvider)

上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来看下内容提供者(ContentProvider)的注入. 和Robo*Activities一样,RoboContentProviders通过RoboGuice也能自动获得注入,为了简便我们可以注入 authority URI,这时我们需要定义下面自己的module: public class Con

【十一】注入框架RoboGuice使用:(Your First Injection into a Custom View class)

上一篇我们简单的介绍了一下RoboGuice的使用([十]注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自定义View的注入(Custom View). 在开始本文之前,你先要熟悉普通Java对象的注入(点击进入).在RoboGuice 3.0版本中你同样给自定义View(Custom View)进行诸如. class MyView extends View { @Inject Foo foo; @InjectView(R.id.my_view) T

【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)

上一篇我们简单的介绍了一下RoboGuice的使用([八]注入框架RoboGuice使用:(Your First Injected Fragment)),今天我们来看下服务(Service)和广播接受者(BroadCast Receiver)的注入 (一):和Robo*Activities一样,RoboServices和RoboIntentServices通过RoboGuice也自动接受注入. 下面是一个使用RoboGuice注入的android service的例子: public class