上一篇我们简单的介绍了一下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)的更多相关文章

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

    上一篇我们简单的介绍了一下RoboGuice的使用([六]注入框架RoboGuice使用:(Singletons And ContextSingletons)),今天我们来看下自己定义绑定(bindi ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([三]注入框架RoboGuice使用:(Your First Resource Injection)),今天我们来看下系统服务的使用注解的方法: 为 ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([九]注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)),今天 ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([八]注入框架RoboGuice使用:(Your First Injected Fragment)),今天我们来看下服务(Service)和广播接受 ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([十]注入框架RoboGuice使用:(Your First Testcase)),今天我们来看下自己定义View的注入(Custom View). ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([十二]注入框架RoboGuice使用:(Your First Injected ContentProvider)),今天我们来看下Log日志使用. ...

  7. 【三】注入框架RoboGuice使用:(Your First Resource Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([二]注入框架RoboGuice使用:(Your First View Injection)),今天我们来看下资源文件的使用注解的方法: 为了在Ac ...

  8. 【八】注入框架RoboGuice使用:(Your First Injected Fragment)

        上一篇我们简单的介绍了一下RoboGuice的使用([七]注入框架RoboGuice使用:(Your First Custom Binding)),今天我们来看下fragment的注解     ...

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

    上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来 ...

随机推荐

  1. Codeforces Round #248 (Div. 1) C - Tachibana Kanade's Tofu AC自动机

    C - Tachibana Kanade's Tofu 思路:把 n 个串丢进AC自动机中,然后dp就好啦. 我的代码居然是在CF上跑最快的.. #include<bits/stdc++.h&g ...

  2. JSP的学习二(请求转发与 重定向)

    一: 1.介绍知识点 1). 本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求. 具体: ①. 请求的转发: 地址栏是初次发出请求的地址.  请求的重定向: 地址栏不再是初次发出的请 ...

  3. 《Android源码设计模式》--装饰模式

    No1: Activity继承于ContextThemeWrapper,继承于ContextWrapper,继承于Context. No2: Context中方法的所有实现均由ContextImpl类 ...

  4. 关于CSRF的那点事儿

    0x01 CSRF简介     CSRF,也称XSRF,即跨站请求伪造攻击,与XSS相似,但与XSS相比更难防范,是一种广泛存在于网站中的安全漏洞,经常与XSS一起配合攻击. 0x02 CSRF原理 ...

  5. 常用的Jquery工具方法

    一.根据后端动态字段,如何把驻点输出在页面上?1.可以提前写好css,设置li的宽度,在页面中通过模板引擎语法动态加载不同的className.2.可以根据驻点个数和位置,用jquery去动态计算赋值 ...

  6. navicat premium 的使用——navicat 连接MySQL数据库

    最近,在学习navicat premium这款第三方软件,他是一个三方数据库管理软件,在前一段时间实习的时候,我使用这款软件调用过服务器上的数据库,不过,当时并没有仔细研究,再次遇到这个软件,我决定仔 ...

  7. 【BZOJ 3456】城市规划

    http://www.lydsy.com/JudgeOnline/problem.php?id=3456 设\(f(n)\)表示n个点有标号无向连通图的数目. dp:\(f(n)=2^{n\choos ...

  8. BZOJ.2738.矩阵乘法(整体二分 二维树状数组)

    题目链接 BZOJ 洛谷 整体二分.把求序列第K小的树状数组改成二维树状数组就行了. 初始答案区间有点大,离散化一下. 因为这题是一开始给点,之后询问,so可以先处理该区间值在l~mid的修改,再处理 ...

  9. [BZOJ4832]抵制克苏恩

    [BZOJ4832]抵制克苏恩 思路: \(f[i][j][k][l]\)表示打了\(i\)次,血量为\(1\sim 3\)的随从有\(j,k,l\)个的期望.转移时注意避免重复. 源代码: #inc ...

  10. mysql长连接

    长连接是干嘛的:  它是做连接复用的: 在openresty中的lua-resty-mysql 里 connect方法去连接mysql时会去ngx_lua cosocket连接池中寻找是否有可用连接 ...