摘要:1,防御性编程。必要时应当考虑采取保护性拷贝的手段来保护内部的私有数据,先来看下面这个例子:[代码]这个类存在两个不安全的地方,首先来看第一个攻击代码[代码]这是因为外部和内部引用了同样的数据,为了解决这个问题,应当修改Period的构造函数:[代码]这样内部的私有数据就与外部对象指向不同,则不会被外部改变再来看第二个攻击代码:[代码]这很显然是由于公有方法暴露了内部私有数据,我们可以只返回内部私...
阅读全文
摘要:1,一个线程可以调用interrupt方法来请求终止另一个线程的运行,也就是说线程的run方法应该不时检查一下它是否应该退出。线程不应该连续不断地工作,应该偶尔进入睡眠或等待状态,以便其他线程由机会得以执行。但当一个线程进入睡眠状态时,它就无法检查自己是否应该终止运行。当另一个线程对当前被中断运行的线程对象调用interrupt方法时,中断调用(sleep或wait)将被InterruptedEx...
阅读全文
摘要:上一篇文章分析了小游戏Snake的基本框架,本文将分析Android自带的另一个小游戏LunarLander,它与前者的“定时器+系统调用onDraw”架构相比,由于采用了“多线程+强制自行绘制”的架构思路,因而更为实用。
阅读全文
摘要:上一篇文章分析了Snake的界面Layout实现,本文将关注游戏主界面这个View是如何实现的,并提出了我的一些困惑之处,顺便也希望有朋友能指点一二。
阅读全文
摘要:上一篇文章介绍了我对Snake这个示例程序进行的一些简单修改,从这一篇开始真正开始详细分析Snake的具体实现。本文首先分析Snake的界面Layout实现,并通过一个实验来说明项目中使用的FrameLayout和RelativeLayout这两种布局的效果,其次还介绍了一个用于UI优化的工具---hierarchyviewer。
阅读全文
摘要:这个系列的前四篇文章介绍了Android sdk中自带的NotePad程序,算是开了个头,这篇开始介绍第二个示例程序—Snake(贪食蛇)。本文将主要介绍我对这个示例程序进行的一些修改。
阅读全文
摘要:上篇文章介绍了Activity的生命周期,并通过一个实验来探索状态转换的机制,然后介绍了应用中使用的一个自定义控件。本文将继续分析NoteEditor类以及Content Provider机制。
阅读全文
摘要:上一篇文章介绍了Android的菜单机制,并动手做了一个实验来探究动态菜单的实验机制。这一篇将重点介绍Activity的生命周期,通过一个简单的实验来摸索状态转换的机制,最后介绍NotePad中使用的自定义控件技术。
阅读全文
摘要:上一篇文章分析了NotesList这个Activity,并着重剖析了其中的intent机制,本文将继续上篇未完的工作,以NotesList为实例介绍Android的菜单机制(尤其是动态菜单机制)。
阅读全文
摘要:俗话说的好,“熟读唐诗三百首,不会作诗也会吟”。最近收集了很多Android的示例代码,从这些代码的阅读和实验中学习到很多知识,从而产生写这个系列的打算,目标就是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。本文是这个系列的第一篇,目标是Android自带的一个范例程序:记事本,将分为三篇文章进行详细介绍。
阅读全文
摘要:这篇说说GUI方面,就以打开种子文件这个窗口为例,我对其代码进行了精简,拿出了一个基本的骨架。首先来看基本的消息主循环部分:[代码]这里运用了单例模式来表示窗口,考虑到线程同步性,在静态工厂方法中使用了synchronized 关键字[代码] 真正的窗口创建工作是在openWindow方法中完成的,下面给出部分核心代码:[代码]这里最重要的如何创建Shell的:[代码]下面就来看看ShellFac...
阅读全文
摘要:AEThread只是一个简单的线程类,提供一个抽象方法runSupport 供我们重写,相必之下,AEThread2有几个改进的地方:1)加入了运行锁机制,运行线程和等待线程的结束这两个操作需要争抢运行锁,若锁未放开,则说明线程还在运行,必须等待锁的释放。2)设置了一个守护线程链表,若待创建的线程是守护线程,当链表为空时,新建一个守护线程加入表尾,否则从链表尾部取一个线程节点来使用,类似线程池。3...
阅读全文
摘要:接着第一篇的工作,本篇继续分析种子文件监听服务器的实现细节。先简单描述下其工作流程,首先服务器在6880端口处开启一个套接字监听,然后开启一个守护线程用于处理到来的“打开种子文件列表”请求,在这个服务线程中不断循环读取来自客户的请求,对torrent文件列表进行解析。如果此时Azureus的各个组件都已经创建完毕,则说明Azureus的核心处理组件可用,则直接对torren...
阅读全文
摘要:BT种子文件使用了一种叫bencoding的编码方法来保存数据。bencoding有四种类型的数据:srings(字符串),integers(整数),lists(列表),dictionaries(字典)编码规则如下:(1)strings(字符串)编码为:<字符串长度>:<字符串>例如:4:test 表示为字符串"test"4:例子 表示为字符串“例子”...
阅读全文
摘要:整个项目运行的起点在com.aelitis.azureus.ui.Main这个类中,它只有一个main主方法,运用Java的反射机制来调用真正的起始点类org.gudy.azureus2.ui.swt.Main的实例对象。代码如下:[代码]而在org.gudy.azureus2.ui.swt.Main这个类中有一个成员变量[代码]它是一个监听服务器,对本地的6880端口进行监听,监听的对象是tor...
阅读全文
摘要:BeanMap这个Map类用于把一个javaBean转换为Map,在其中存储了javaBean的各个属性的setXXX方法和getXXX方法,属性的类型。 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public class BeanMap ext...
阅读全文
摘要:这个Map类是基于红黑树构建的,每个树节点有两个域,一个存放节点的Key,一个存放节点的Value,相当于是两棵红黑树,一棵是关于key的红黑树,一棵是关于Value的红黑树。
阅读全文
摘要:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public abstract class AbstractBagDecorator extends AbstractCollectionDecorator implements Bag { pr...
阅读全文