[DS] 标记字段
标记字段
代码中有时候有这种需求:需要一个公共访问的标记字段,以下称为标记字段。
下面是案例:
一个订单详情页面,如果页面在显示中,程序中其它地方需要访问这个“正在查看中”的订单信息,订单详情页面打开和关闭时负责设置和清除公共字段所标记的订单对象。在像Android这样的设备上,假设页面可以打开多个,但是用户只会看到最上面的一个,那么此时只有处在任务栈最上面的OrderDetailActivity对象在其onStart和onStop中负责标记的订单的设置。假设有1和2两个详情页面依次被打开,然后依次关闭2、1,其onStart、onStop的执行顺序可能是像下面的:
09-26 11:55:10.808 5493-5493/? D/hxwcc: onStart + @1
09-26 11:55:14.840 5493-5493/? D/hxwcc: onStart + @2
09-26 11:55:15.228 5493-5493/? D/hxwcc: onStop + @1
09-26 11:55:16.672 5493-5493/? D/hxwcc: onStart + @1
09-26 11:55:17.076 5493-5493/? D/hxwcc: onStop + @2
09-26 11:55:19.548 5493-5493/? D/hxwcc: onStop + @1
可见onStart和onStop的执行是有交叉的。在对标记字段进行赋值时,需要考虑这种“相互干扰”,这里的执行都是在UI线程中执行,多线程环境下当然更容易产生这样的交叉赋值。从需求上看,不是当前对象设置的标记它就不应该去清除,因为另一个对象在重新设置标记字段的值得时候自动清除了上一标记值。
可以使用一个额外的字段记录对标记进行赋值的对象,然后通过比较当前对象标记试图操作的对象和之前设置已有标记值的对象就可以得到需要的标记作用。
下面设计一个类型FlagField来组合标记值和标记人,使得标记字段的含义更加内聚。
FlagField类型
代码如下:
/**
* 标记字段,用来存储被公共访问的带有赋值者信息的数据。赋值者在合适的时间赋值,
* 之后可以清除标记值,如果中间有其它
* 赋值者重新标记则清除操作不做任何动作——访问者继续 访问新的标记。
*/
public class FlagField<T> {
private T field;
private Object provider;
public void mark(T field, Object provider) {
synchronized (this) {
this.field = field;
this.provider = provider;
}
}
public T getField() {
synchronized (this) {
return this.field;
}
}
public Object getProvider() {
synchronized (this) {
return this.provider;
}
}
public boolean isMarked() {
synchronized (this) {
return field != null;
}
}
public void clear(Object provider) {
synchronized (this) {
if (provider == this.provider) {
field = null;
provider = null;
}
}
}
}
上面提供了线程安全的版本,如果不需要多线程控制去掉synchronized (this)即可。
使用案例如下:
public class OrderDetailActivity extends Activity {
/** 当前正在被查看的订单id */
public static FlagField<Integer> viewingOrderId = new FlagField<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewingOrderId.mark(10086, this);
}
@Override
protected void onDestroy() {
super.onDestroy();
viewingOrderId.clear(this);
}
}
(本文是由Atom编写)
[DS] 标记字段的更多相关文章
- RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers的双语版
RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers英文版 ...
- 关于Differentiated Services Field (DS Field)的诸多疑问
Differentiated Services Field (DS Field) 先上疑问截图: 这是用wireshark抓包时协议树的某一项的展开结果:IPV4 header.其中有一项如下: 大家 ...
- 【JPA】字段访问、属性访问及混合访问
[JPA]字段访问.属性访问及混合访问 转载:https://www.cnblogs.com/yangchongxing/p/10120318.html 1.字段访问 注解字段,通过反射来获得和设置字 ...
- Discuz! X3 数据表、数据字段说明
pre_common_admincp_cmenu 后台菜单收藏表 字段名 数据类型 默认值 允许非空 自动递增 备注 id smallint(6) unsigned NO 是 title v ...
- CodeGen字段循环Field Loop
CodeGen字段循环Field Loop 字段循环是一个模板文件构造,它允许迭代CodeGen拥有的有关字段的集合.这些字段定义可以来自以下两个位置之一: •如果基于从存储库结构中获取的信息生成代码 ...
- Container and Injection in Java
一.Container 1.为什么使用Container 通常,瘦客户端多层应用程序很难编写,因为它们涉及处理事务和状态管理.多线程.资源池和其他复杂的低级细节的复杂代码行.基于组件和独立于平台的Ja ...
- haproxy参数
https://blog.csdn.net/chengfei112233/article/details/78983026 https://www.cnblogs.com/dkblog/archive ...
- 《TCP/IP 详解 卷1:协议》第 5 章:Internet 协议
IP 是 TCPIP 协议族中的核心协议.所有 TCP.UDP.ICMP.IGMP 数据都通过 IP 数据包(又称为 packet)来传输.IP 的英文名为 Internet Protocol,是互联 ...
- SIP穿越NAT SIP穿越防火墙-SBC
FireWall&NAT FireWall是一种被动网络安全防卫技术,位于网络的边界.在两个网络之间运行訪问控制策略.防止外部网络对内部信息资源的非法訪问,也能够阻止特定信息从内部网络被非法输 ...
随机推荐
- DDR的前世与今生(一)
作者:一博科技 DDR SDRAM全称为Double Data Rate SDRAM,中文名为"双倍数据率SDRAM".DDR是在原有的SDRAM的基础上改进而来,严格的说DDR应 ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- 使用ubuntu作为web开发环境的一些感受
从ms-dos,win95,win98,winMe,winXp,vista,win7,win10我都有使用的经历,我使用时间最长的应属winxp,其次是win7,说实话,我觉得这两个系统是微软做的最好 ...
- dagger2系列之Scope
Dagger的Scope注解代表的是作用域,通过实现自定义@Scope注解,标记当前生成对象的使用范围,标识一个类型的注射器只实例化一次,在同一个作用域内,只会生成一个实例, 然后在此作用域内共用一个 ...
- eclipse — 导入android项目后识别成java项目的问题及解决
最近在eclipse导入android项目的时候遇到了奇葩问题,再此记录 遇到的问题就是:将完好的android项目导入到eclipse的时候,原本这是一个很容易的事情,但是导入成功后发现,,,靠ec ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...
- 将css和js缓存到localStorage缓存,提高网页响应速度
适用于小站点,这很极致,很快速~~ /** * Created by SevenNight on 2016/9/21 0021. * 插件功能:使用localStorage缓存js和css文件,减少h ...
- 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动 ...
- 【Java并发编程实战】----- AQS(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...
- 用java开发微信公众号:接收和被动回复普通消息(三)
上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复.说到普通消息,那么什么是微信公众号所定义的普通消息呢,微信开发者文档中提到的接收的普通消息包括如下几类: 1.文本 ...