LRU cache in Android

曾经我们使用 WeakReference 来处理 Android 中 Out of Memory 的问题。但是随着 Google 修改了回收机制的行为,这个方法已经没什么用了。 因此,Google 为我们提供了一个新的数据结构,LRU cache。 它的使用是这样的 LruCache bitmapCache = new LruCache<String, Bitmap>() 像是使用 Map ,但是它有一些独特的行为特性。 使用前,我们需要确定 cache 的大小。如何确定需要多大的空间? Google 给了我们一个最佳实践的空间计算方法。g ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); int availMemInBytes = am.getMemoryClass() * 1024 * 1024; LruCache bitmapCache = new LruCache<String, Bitmap>(availMemInBytes / 8); 另外还有一个重要的部分是我们需要告诉 cache 每个 bitmap 的大小,如何告诉?重写 sizeOf 方法 public class ThumbnailCache extends LruCache(String, Bitmap) { @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } } 前面提到过使用 cache 像是使用 Map。但是这个 cache 可能会返回 null,表示 cache 中找不到我们需要的文件,这时候我们就需要从其他地方载入图片然后把它塞进 cache 中。 ...

June 8, 2015

Red black tree

Intro Before introducing a red black tree, we need to know what is a binary search tree. Binary search tree Binary search tree’s features insert cost order lgn find cost order lgn delete cost order lgn If we want all operations are order lgn time, we need to make sure the tree is balanced. A red black tree is balanced all the time. We can say a red black tree is a self balanced binary search tree. ...

April 15, 2015

farewell 2014

前途是光明的,道路是曲折的 2014 发生了太多的事情,并不是平稳的一年,正如引用所说,今年可以概括为曲折与光明并存的一年。 工作 在广州找到的这家公司是一家创业型的公司,工作还是蛮有趣的,无奈由于公司和自身的原因,在年初就离开了公司。 在把私事做完后从新开始找工作。那时候大概是四到五月份。我发现在 51job 更新了简历后,差不多每天都有2到3个电话打过来说有兴趣给我面试机会,心想广州对于 Android 的人才还是很渴求的。除了被动接受面试邀请,也投了几家自己心仪的互联网公司。然后就是满满的面试日程了。 我所投的职位都给了我面试机会,感到有点幸运。对于 Android 的面试,一方面会问 JAVA 的熟悉程度,一方面会问 Android 的相关机制。当然了,作为技术面试,还会涉及到基础数据结构例如链表实现,多线程模型例如生产者和消费者,算法基础例如压缩算法的实现。 面试了两个星期,收获了不少 offer。除了一堆小公司,还有网易,YY,搜狐,翼支付等公司的。各公司给的薪金还可以,但是大部分都需要加班,这似乎是大环境。。最后经过综合考虑,选择了网易。 在网易工作非常愉快,除了工作,网易还有很多活动,例如每个月例行聚餐,公司对于节日的安排的小节目,不定期的培训,每天在健身室流汗。今年还去了一次珠海与澳门的旅游。 袋鼠国 在今年的第四季度,还在上班,接到老婆的一个电话,我们申请的袋鼠国的签证通过了,感觉是一个大大的 bonus 。接着我们就开始计划前往这个梦寐以求的国度了。虽然需要放弃国内的工作和离开家人一段时间,但是我是相信,前途还是光明的。 在去的路上。今年飞机事故蛮多的,幸好我们一切都顺利。 坐了十多个小时的飞机,踏入一个新的国度,开始,一切都是新奇。 过完年,还在适应期。开始学车和找工作了。 TODO 2015年一切都是未知,曲折,向上,要立足需要比之前更加努力。 下面是今年需要完成的事情,贴出来让各位监督。 考取 full license 找到专业工作 体重保持到 70kg

January 3, 2015

tmux

tmux 犹如 screen,用来在控制台里打开多个窗口,以达到减少打开控制台的数目和快速切换的目的。算是一个效率工具。 tmux 有很多快捷键,这些快捷键用来完成不同的操作,如能灵活运用,可以达到提高效率的目的。 Session Manager tmux里面的Session就像是一个工作台,每次打开tmux,其实就是打开一个 Session 。我们可以根据不同的使用场景来定义不同的 Session。例如我专门建立了一个叫做 blog 的 Session。用来做 blog 相关的工作(设置环境变量,打开文章,编译,上传等)。我主要用到如下命令来管理Session。 tmux new -s session_name 创建一个 Session 名字叫做 session_name tmux list-sessions (tmux ls) 列出当前有什么 Session 在后台 tmux attach -t session_name (tmux a -t session_name) 打开一个已经创建的叫做 session_name 的 Session。 tmux switch -t session_name 切换到session_name tmux detach (c-b d) 临时退出 Session。也就是退出了 tmux Windows 我们可以在 Session里面建立标签,也即是 Windows。每个 window 也有自己的名字。例如我在 blog 这个 Session 里面建立了两个 window 一个叫 serve 用来运行本地服务器,另一个叫 compile 用来编译 blog。我可以很方便的在两个 window 之间切换。其中相关的命令如下。 tmux new-window (c-b c) 创建一个新的 window ...

December 1, 2014

why Android Studio use Gradle as its new Build System

Google 原来使用 Ant 作为它的构建系统。但在使用了 Android Studio 后却确定使用 Gradle。 新构建系统的要求 容易重建代码和资源 容易创建不同程序的变体,无论是要创建多个发布版本还是为同一个程序创建不同的属性 易于配置,扩展和定制构建流程 IDE集成 为什么是 Gradle gradle 是一个高级的构建系统,同时允许工具通过插件创建定制化构建逻辑。 下面是我们使用 Gradle 的一些原因: 使用 Domain Specific Language 来描述和控制构建逻辑 构建文件是基于 Groovy的,而且通过 DSL 支持装饰元素(例如 dependencies,configurations) 还可以使用代码来操作 DSL 元素来提供定制逻辑。 通过 Maven 和/或 Ivy 来管理依赖关系 非常灵活, 允许使用最佳实践但不强制使用唯一方式来完成事项。 插件可以提供其特定 DSL 和他们特定 的 API 给构建文件使用。 良好的 API 集成 版本要求 Gradle 1.10 或 1.11 或 1.12 + plugin 0.11.1 SDK 构建工具 19.0.0以上 基本工程 一个 Gradle 工程会在工程的根目录创建一个叫做 build.gradle 的文件 简单地构建文件 最简单的 Java 工程构建文件 build.gradle 如下 ...

December 1, 2014