[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是一种被动网络安全防卫技术,位于网络的边界.在两个网络之间运行訪问控制策略.防止外部网络对内部信息资源的非法訪问,也能够阻止特定信息从内部网络被非法输 ...
随机推荐
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- Angular2入门系列教程2-项目初体验-编写自己的第一个组件
上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...
- 恢复SQL Server被误删除的数据
恢复SQL Server被误删除的数据 <恢复SQL Server被误删除的数据(再扩展)> 地址:http://www.cnblogs.com/lyhabc/p/4620764.html ...
- 很多人很想知道怎么扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi,今天说下这些格式,明天做个demo
有些功能部分手机不能使用,网站,通讯录,wifi基本上每个手机都可以使用. 在看之前你可以扫一扫下面几个二维码先看看效果: 1.二维码生成 网址 (URL) 包含网址的 二维码生成 是大家平时最常接触 ...
- 【Web动画】SVG 线条动画入门
通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...
- UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)
最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...
- nodejs项目mysql使用sequelize支持存储emoji
nodejs项目mysql使用sequelize支持存储emoji 本篇主要记录nodejs项目阿里云mysql如何支持存储emoji表情. 因由 最近项目遇到用户在文本输入emoji进行存储的时候导 ...
- 步入angularjs directive(指令)--准备工作熟悉hasOwnProperty
在讲解directive之前,先做一下准备工作,为何要这样呢? 因为我们不是简单的说说directive怎么用,还要知道为什么这么用!(今天我们先磨磨刀!). 首先我们讲讲js 基础的知识--hasO ...
- [原]HAproxy 代理技术原理探究
HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...