虽说现在做网络请求有了Volley全家桶和OkHttp这样好用的库,但是在处理其他后台任务以及与UI交互上,还是需要用到AsyncTask。但是你真的了解AsyncTask吗?

AsyncTask的实现几经修改,因此在不同版本的Android系统上表现各异;我相信,任何一个用户量上千万的产品绝对不会在代码里面使用系统原生的AsynTask,因为它蛋疼的兼容性以及极高的崩溃率实在让人不敢恭维。本文将带你了解AsyncTask背后的原理,并给出一个久经考验的AsyncTask修改版。

阅读全文 »

毫不夸张地说,Binder是Android系统中最重要的特性之一;正如其名“粘合剂”所喻,它是系统间各个组件的桥梁,Android系统的开放式设计也很大程度上得益于这种及其方便的跨进程通信机制。

理解Binder对于理解整个Android系统有着非常重要的作用,Android系统的四大组件,AMS,PMS等系统服务无一不与Binder挂钩;如果对Binder不甚了解,那么就很难了解这些系统机制,从而仅仅浮游与表面,不懂Binder你都不好意思说自己会Android开发;要深入Android,Binder是必须迈出的一步。

现在网上有不少资料介绍Binder,个人觉得最好的两篇如下:

  1. Binder设计与实现
  2. Android进程间通信(IPC)机制Binder简要介绍和学习计划系列

其中, 《Binder设计与实现》以一种宏观的角度解释了Android系统中的Binder机制,文章如行云流水;如果对于Binder有一定的了解再来看着篇文章,有一种打通任督二脉的感觉;每看一次理解就深一层。老罗的系列文章则从系统源码角度深入分析了Binder的实现细节;具有很大的参考意义;每当对于Binder细节有疑惑,看一看他的书就迎刃而解。

但是遗憾的是,Binder机制终究不是三言两语就能解释清楚的,一上来就扒出源码很可能深陷细节无法自拔,老罗的文章那不是一般的长,如果看不懂强行看很容易睡着;勉强看完还是云里雾里;相反如果直接大谈特谈Binder的设计,那么完全就是不知所云;因此上述两篇文章对于初学者并不友好,本文不会深入源码细节,也不会对于Binder的设计高谈阔论;重点如下:

阅读全文 »

我们使用纯文本写代码,有了Markdown又可以使用纯文本写文档,那么对于更直观的信息表达方式——图片,能不能使用纯文本描述呢?

另外,你是否见到过这样的注释:

ASCII art图像

没错,这种逼格极高的ASCII图片注释方式就是我们要讨论的话题。

阅读全文 »

虽然大部分的时候是使用命令行,但是有些时候我们需要在Finder里面编辑某些文件的时候,如果还是拘泥于这样,就必须打开 iTerm (幸好有Profile可以一键打开终端)切换目录,编辑;这时候,类似Windows系统的右键菜单就比较方便了。

如果Mac系统识别出这是一个文本文件,右键菜单的 打开方式 可能还有点用,如果识别不出来,那么手动选择应用程序就比较麻烦了:

其实Mac系统的 AutoMator 是可以完成这个功能的;接下来说一下操作步骤。

阅读全文 »

写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug;那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点;可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field Watchpoint ?

几种不同的断点

你有关注过Android Studio旁边断点的区别吗?比如上图三个断点有什么不同?且听我一一道来。

阅读全文 »

本文将继续介绍一些非常实用的但是你可能不知道的快捷键;没看过前两篇的可以移步:

  1. Android Studio你不知道的快捷键(一)
  2. Android Studio你不知道的快捷键(二)

Select In..

说实话,想不出一个比较好的翻译 :P 干脆使用英文吧。

Select In..

有没有这样的场景:你在Android Studio打开了一个图片文件(或者别的文件),想在资源浏览器里面查看这图片;在Eclipse里面我想大部分的人是Alt + Enter进入文件属性复制地址,然后在系统资源管理器里面打开;或者装一个EasyExplore插件。在Android Studio里面,这是内建支持的!而且还不止如此!比如你想看看某个文件在包的哪个目录,通常是不是点击Project View上面的那个小圆坐标;用这个快捷键鼠标就能搞定。

阅读全文 »

Android Studio你不知道的快捷键(一)里面,主要讲述了一些窗口操作的快捷键还有补全参数提示等,这一篇会分享一些代码代码编辑的快捷键。(默认Keymap上文)

自动生成变量

自动生成变量

作为一门静态类型语言,Java是有一定的类型推导能力的;那么你是否经常书写:

1
2
String testStr = "testStr";
List<String> testStrings = new ArrayList<String>();

其实大可不必写那些恼火的类型声明的,一看就知道testStr, testStrings就知道是什么类型,再这么干不就是废话么!好在IDEA给了我们这个能力。尝试一下这个快捷键吧,会给你惊喜。

阅读全文 »

一般来说键盘用的越多鼠标用的越少,那么写起代码来效率就越高;常见的快捷键想必大家都已经掌握,接下来我就分享一些你可能不知道的但确非常实用的快捷键。

下文所有快捷键基于如下keymap
Windows: Default
Linux: Default
OSX: Mac OSX 10.5+

自动补全的时候是Enter还是Tab?

自动补全enter和tab区别
在使用自动补全的时候EnterTab的行为还是有一些细微的区别的:

阅读全文 »

I call it my billion-dollar mistake. It was the invention of the null reference in 1965. I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement.
—Tony Hoare

有人说,当你处理过了空指针异常才真正成为一个Java开发者。抛开玩笑话不谈,空指针确实是很多bug的根源。Java SE 8引入了一个新的叫做java.util.Optional 的类来缓解这个问题。

我们首先看看空指针有什么危险,Computer是一个嵌套的对象,如图:
Comtuper对象

下面的代码有什么潜在的问题呢?
String version = computer.getSoundcard().getUSB().getVersion();

貌似可行,但是,很多电脑(比如 Raspberry Pi)并没有Soundcard,因此调用getSoundcard会发生什么?毫无疑问,结果自然是在运行时给你抛出一个NullPointException,然后终止程序的执行。

如何避免上面的空指针异常呢?一般的做法就是在调用方法之前进行检测:

阅读全文 »

Alfred是个好东西,不过检索程序的时候不支持拼音搜索;我在论坛看到有人给作者反馈过,无奈作者说支持中文,他不知道拼音是什么,于是就不了了之了。举个例子:我想打开网易云音乐,可是当我输入wangyiyunyinyue的时候却是这样的结果:

不支持拼音的搜索结果

要么我知道这个App的名字叫做NeteaseMusic,要么我就需要用中文输入网易云音乐打开了;如果恰巧输入法是英文输入状态,那么就会遇到上图的情况;这时候再把已经输入的删除然后切换输入法打开,效率无疑大大折扣。

阅读全文 »