写代码不可避免有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,要么我就需要用中文输入网易云音乐打开了;如果恰巧输入法是英文输入状态,那么就会遇到上图的情况;这时候再把已经输入的删除然后切换输入法打开,效率无疑大大折扣。

阅读全文 »

长久以来,输入法一直是困扰mac用户的一个问题;不过随着国内厂商的跟进,这种状况得到了极大的改善。不用自己去折腾什么鼠须管了,狼厂和企鹅都做的不错。

不过依然有一个问题没有完全解决:不同程序之间输入的自动切换。

相信大家一定有切换到item2输入两个命令发现是中文然后按cmd + space切换的尴尬;另外如果你如果使用vi或者emacs,那么就更蛋疼了。造成这种状况的根本原因在于:输入法的状态是混乱的,我无法明白现在自己处于哪一种输入环境,除非我开始打字或者看右上角输入法的图标。我希望item2,Intellij IDEA,Alfred2永远是英文输入状态,除非手动切换;其他的程序比如chrome浏览器,邮件客户端保持正常。

打个比方,使用sublime写代码,大多数情况下肯定是英文输入状态,写注释的时候可能手动切换到中文;但是这里有个问题,这时候如果我切换到其他程序,然后改变了输入的状态,再次回到sublime,fuck!怎么又成了中文!

目前解决方案有如下方式:

  1. mac系统自带的设置-> 键盘 -> 输入源 -> 自动使用文稿的输入源
  2. 一些输入法的类似安静模式的功能
阅读全文 »

mac下的P2P下载工具目前只有迅雷了,可是大家都知道mac下只有“会员迅雷”才能下载,没会员就是个废物。对于冷门资源离线下载还是是非常非常有用的,高速下载对速度提升也是显而易见。

想必都不会为了临时下载一个资源去开一个会员,肯定有过上网搜迅雷会员的经历;这里教大家如何把这个过程变成一个自动化的工作。如果长期使用迅雷的话,建议还是开会员去;本教程仅供学习使用,用完请于24小时之内删除

先看看效果:
效果图

阅读全文 »

最近优化一段代码的调用时间,发现性能瓶颈居然是io和split!io操作慢情有可原,那么对于split有没有更高效的方法呢?

一般方法

再java里面,一般的split 字符串解决方案有三种:

  1. 直接用split函数
  2. 使用StingTokenizer类
  3. indexOf,subString实现;

在JDK6的实现中,String类的split直接使用了正则表达式;不得不说,真是杀鸡焉用牛刀。

1
2
3
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}

在Android VM(Android 4.0以上系统源码如此)里面,对这个方法做了一定的优化:

阅读全文 »

如何打印日志?这不是很简单,直接使用android.util.Log这个类不就行了?然而,日志属于非常敏感的信息;逆向工程师在逆向你的程序的时候,本来需要捕捉你程序的各种输出,然后进行推测,顺藤摸瓜然后得到需要的信息;一旦你的日志泄漏,无异于门户洞开,破解你的程序如入无人之境。
安全的概念本来就是相对的,如果破解你程序的代价远远大于破解得到的价值,那么就可以认为程序是“安全的”;这里就分析一下,为了提高程序的安全性,在打印日志的时候应该注意什么。

阅读全文 »