【六】注入框架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
【六】注入框架RoboGuice使用:(Singletons And ContextSingletons)的更多相关文章
- 【七】注入框架RoboGuice使用:(Your First Custom Binding)
上一篇我们简单的介绍了一下RoboGuice的使用([六]注入框架RoboGuice使用:(Singletons And ContextSingletons)),今天我们来看下自己定义绑定(bindi ...
- 【四】注入框架RoboGuice使用:(Your First System Service Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...
- 【十】注入框架RoboGuice使用:(Your First Testcase)
上一篇我们简单的介绍了一下RoboGuice的使用([九]注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)),今天 ...
- 【九】注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)
上一篇我们简单的介绍了一下RoboGuice的使用([八]注入框架RoboGuice使用:(Your First Injected Fragment)),今天我们来看下服务(Service)和广播接受 ...
- 【十一年】注入框架RoboGuice采用:(Your First Injection into a Custom View class)
上一篇我们简单的介绍了一下RoboGuice的使用([十]注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自己定义View的注入(Custom View). ...
- 【十三】注入框架RoboGuice采用:(Logging via Ln)
上一篇我们简单的介绍了一下RoboGuice的使用([十二]注入框架RoboGuice使用:(Your First Injected ContentProvider)),今天我们来看下Log日志使用. ...
- 【三】注入框架RoboGuice使用:(Your First Resource Injection)
上一篇我们简单的介绍了一下RoboGuice的使用([二]注入框架RoboGuice使用:(Your First View Injection)),今天我们来看下资源文件的使用注解的方法: 为了在Ac ...
- 【八】注入框架RoboGuice使用:(Your First Injected Fragment)
上一篇我们简单的介绍了一下RoboGuice的使用([七]注入框架RoboGuice使用:(Your First Custom Binding)),今天我们来看下fragment的注解 ...
- 【十二】注入框架RoboGuice使用:(Your First Injected ContentProvider)
上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来 ...
随机推荐
- java.lang.NoClassDefFoundError: javax/persistence/EntityListeners
在使用 Hibernate 进行数据库操作的时候,在启动 Tomcat 服务器后,Console 控制台可能会打印出这样的异常:java.lang.NoClassDefFoundError: java ...
- java.lang.NoClassDefFoundError: ognl/PropertyAccessor
本篇对 Web 开发中,项目部署后.开启 Tomcat 服务器 Console 控制台报错 java.lang.NoClassDefFoundError: ognl/PropertyAccessor ...
- 黑马程序员_java基础笔记(02)...java语言基础组成
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— java语法(1:关键字,2:标识符,3:注释,4:常量和变量,5:运算符,6:语 ...
- Web层的Controller代码逻辑
需要做的功能: 1.数据的校验. 为什么不在后面的Service层校验呢? 原因:Service是通用的,而调用方Controller有多个,每一个Controller代表一个业务,这些业务需要校验的 ...
- 8-3 Bits Equalizer uva12545
题意: 给出字符串s包含'0' '1' '?'; 再给出字符串t只包含01: 现在我们可以对S做三个操作:把0变成1,把?变成0或1,任意两个位置交换: 问最少操作几次s == t: 贪心 默认除去那 ...
- CSUOJ 1008 Horcrux
Description A Horcrux is an object in which a Dark wizard or witch has hidden a fragment of his or h ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- CentOS重装grub修复损坏的系统
grub损坏一般有两种情况:第一.安装双系统时,后安装的系统把先安装的系统的MBR删除了.第二.误操作将grub文件删除了. 不管怎样都需要进入到救援模式,详细请看CentOS通过光盘启动救援数据 ( ...
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...
- vijos 1880 变形最短路
题意:Ninian 的魔力可以在结界间传递.结界中有 N 个光柱,第 i 个光柱的光压范围为 0~Ei .魔力可以有 M 种传递,从光柱 Ai 传递到光柱 Bi ,花费时间 Ti .当魔力从光压为 S ...