当前位置:  编程技术>移动开发
本页文章导读:
    ▪运用PMD检查代码        使用PMD检查代码 以前不知道PMD,最近听说了PC Lint,才开始接触PMD,这么好的工具,如果善用了,真是可以帮助提高很多,对自己的代码习惯、规范等都有很大的帮助~ 来看看他到底是怎么样.........
    ▪ gallery图片平添倒影显示及spinner多级联动效果        gallery图片添加倒影显示及spinner多级联动效果 spinner效果。就是选择省份。马上列表内容变为省分的城市gallery效果如下图所示 ......
    ▪ 微博API timeline压缩的主意       微博API timeline压缩的想法 智能手机的用户越来越多,但是据统计有一半使用智能手机的人通过GPRS这样的慢速网络上网,当微博客户端使用慢速网络上网时,时间线的数据大小就成为用户.........

[1]运用PMD检查代码
    来源: 互联网  发布时间: 2014-02-18
使用PMD检查代码

以前不知道PMD,最近听说了PC Lint,才开始接触PMD,这么好的工具,如果善用了,真是可以帮助提高很多,对自己的代码习惯、规范等都有很大的帮助~

来看看他到底是怎么样的》。。。

    很多公司都在用的PC Lint是针对C/c++的一个静态代码审查工具,据说Microsoft把PC Lint审查无错误无警告作为代码要过的第一关;而PMD是个跟他功能类似的针对java的工具,PMD是开源的,可以下载到整个开源项目,其官网上有对其这样的简介(PMD):

简介

PMD scans Java source code and looks for potential problems like:

  • Possible bugs - empty try/catch/finally/switch statements
  • Dead code - unused local variables, parameters and private methods
  • Suboptimal code - wasteful String/StringBuffer usage
  • Overcomplicated expressions - unnecessary if statements, for loops that could be while loops
  • Duplicate code - copied/pasted code means copied/pasted bugs

译:

PMD扫描java代码并寻找潜在的如下问题:

     1.可能的bug - 空try/catch/finally/switch语句

     2.无效代码 -未使用的变量,参数和私有方法

     3.非最佳的代码 - 较耗费资源的String/StringBuffer用法

     4.过于复杂的表达式 - 不必要的if语句,或应该为while的for循环

     5.重复代码 - 复制/粘贴代码意味着复制/粘贴bug

下载

这里可以下载最新版本的PMD(pmd-4.2.5),里面有源代码和bin zip,下载bin的压缩包就可以了,如下图:

我下载的时候,速度超慢,10KB/s的跳~

使用

下载下来之后,随便解压到任意目录,然后根据自己的目录修改下面的这个脚本(.bat),放置到解压出来的目录的bin文件夹下即可;

@echo off

rem 要检查的文件和路径,也可以是代码目录
set filepath=E:\SRC\ComposeMessageActivity.java
rem 报告输出的路径
set reportpath=E:\

rem 获取当前年月日和时分秒
set nowTime=%DATE:~0,10%" "%TIME:~1,7%

rem 替换:为-
set nowTime=%nowtime::=-%

rem 合成报告文件路径名
set outfile=%reportpath%%nowtime%.html

rem 指定输出的格式
set xslt="../etc/xslt/corley-pmd-report.xslt"

rem 指定检查规则,这里包括了官方推出的java的所有规则,也可以自己指定其他规则
set ruleset="rulesets/internal/all-java.xml"

rem 执行检查并输出报告
pmd %filepath% nicehtml %ruleset% -xslt %xslt% -reportfile %outfile%

 

 

运行这个脚本文件就可以得到报告文件如下: 

Summary Files Total QRank Level 1 QRank Level 2 QRank Level 3 QRank Level 4 QRank Level 5 QRank Level 6 QRank Level 7 QRank Level 8 1 18
0
0
18
0
0
0
0
0
E:\SRC\ConfirmRateLimitActivity Prio Begin Line Method Description Total number of violations for this class: 18 (Click anywhere on this row to see/hide details)  
3
42   Found non-transient, non-static member. Please mark as transient or provide accessors.
3
43   Found non-transient, non-static member. Please mark as transient or provide accessors.
3
44   Found non-transient, non-static member. Please mark as transient or provide accessors.
3
44   To be compliant to J2EE, a webapp should not use any thread.
3
47 onCreate Avoid excessively long variable names like savedInstanceState
3
47 onCreate Parameter 'savedInstanceState' is not assigned and could be declared final
3
55 onClick Avoid variables with short names like v
3
55 onClick Parameter 'v' is not assigned and could be declared final
3
62 onClick Avoid variables with short names like v
3
62 onClick Parameter 'v' is not assigned and could be declared final
3
68 onCreate To be compliant to J2EE, a webapp should not use any thread.
3
71 run Log.v calls should be protected by checking Config.LOGV first
3
84 onResume Local variable 'delay' could be declared final
3
99 onPause super should be called at the end of the method
3
105 onKeyDown Parameter 'event' is not assigned and could be declared final
3
105 onKeyDown Parameter 'keyCode' is not assigned and could be declared final
3
113 doAnswer Parameter 'answer' is not assigned and could be declared final
3
114 doAnswer Local variable 'intent' could be declared final


Generated by PMD 4.2.5 on 2011-09-09 - 14:49:43.

 

(1).生成的报告界面十分友好,每个类存在什么级别的多少个问题,一目了然。

(2).存在的每个问题,如何修改的建议也一一指出,比如

line: 84
方法: onResume
建议:Local variable 'delay' could be declared final
意思是说,这个函数里的变量delay最好加上final关键字~

     接下来便是按照提示一个个更改了,相信修改之后代码可以让自己慢慢欣赏了,因为里面检查的大多数规则,都是有着丰富经验的JAVA程序员提供的AST(抽象语义树,不用明白它具体什么意思,可以当做一条检查规则),它从程序容易出现的问题,和不规范的设计等等方面进行了检查。

    重要的是长期坚持,这样好的编程习惯应该会不自觉的形成,说实话,PMD真的很严格,苛刻,所以PMD和PC LInt这类工具不少公司在真正使用时都会对规则进行过滤,要不然搞出来的错误实在是太多了~~~


    
[2] gallery图片平添倒影显示及spinner多级联动效果
    来源: 互联网  发布时间: 2014-02-18
gallery图片添加倒影显示及spinner多级联动效果
spinner效果。就是选择省份。马上列表内容变为省分的城市
gallery效果如下图所示

    
[3] 微博API timeline压缩的主意
    来源: 互联网  发布时间: 2014-02-18
微博API timeline压缩的想法
智能手机的用户越来越多,但是据统计有一半使用智能手机的人通过GPRS这样的慢速网络上网,当微博客户端使用慢速网络上网时,时间线的数据大小就成为用户体验的关键,如果能压缩数据传输,好处自然是不用说的。

让我们看看一个典型的Timeline是什么样的格式。实例如下.
{ created_at: 'Tue Nov 08 11:50:41 +0800 2011',
 id: 3377424618238221,
 text: '11月7日,开发区管委会与全美华人金融协会战略合作协议签订仪式在开发区投资服务中心举行。开发区(南港工业区)管委会党组副书记、管委会副主任孙胜,开发区(南港工业区)管委会副主任郎东会见全美华人金融协会会长、汉世纪投资管理有限公司管理合伙人、总裁吴皓一行,并共同出席签字仪式。',
 source: '<a href="http://weibo.com" rel="nofollow">新浪微博</a>',
 favorited: false,
 truncated: false,
 in_reply_to_status_id: '',
 in_reply_to_user_id: '',
 in_reply_to_screen_name: '',
 thumbnail_pic: 'http://ww1.sinaimg.cn/thumbnail/81ab7491tw1dmwcy8hekuj.jpg',
 bmiddle_pic: 'http://ww1.sinaimg.cn/bmiddle/81ab7491tw1dmwcy8hekuj.jpg',
 original_pic: 'http://ww1.sinaimg.cn/large/81ab7491tw1dmwcy8hekuj.jpg',
 geo: null,
 mid: '3377424618238221',
 user: 
  { id: 2175497361,
    screen_name: '天津开发区投促三局',
    name: '天津开发区投促三局',
    province: '12',
    city: '26',
    location: '天津 滨海新区',
    description: '天津开发区热情欢迎国内外客商来区考察、投资。有关区域发展详情和投资程序可咨询天津开发区投资网www.investteda.org',
    url: '',
    profile_image_url: 'http://tp2.sinaimg.cn/2175497361/50/5602903704/1',
    domain: '',
    gender: 'm',
    followers_count: 1328,
    friends_count: 154,
    statuses_count: 168,
    favourites_count: 0,
    created_at: 'Mon Jun 13 00:00:00 +0800 2011',
    following: false,
    allow_all_act_msg: false,
    geo_enabled: true,
    verified: true } }

以上代码是新浪微博一个典型消息的JSON格式,timeline就是由20个这样格式的消息组成。一个timeline请求通常响应大约30K的数据,经过gzip -9压缩后,仍然有大约7K字节数据。那么其尺寸消耗在哪里呢?第一部分:对象中很多属性客户端并不需要,也传了过去,另外一部分:属性名字占的字节数通常比属性值还要大。

属性名的作用是当我们拿到一个属性值的时候不知道其意义,需要名字来标识区分的。那么如果客户端和服务器端约定了某个字段是的意义,就不需要传输名字了。

基于以上两个想法,我在开源项目node-fanfou (https://github.com/FanfouAPI/node-fanfou)上实现了如下的压缩/解压缩过程
1. 指定了需要传输的timeline 属性名, 如下
var status_fields = ['id', 'text', 'created_at',
                     ['user', 'id'], ['user', 'name'],
                     ['user', 'screen_name'], ['user', 'profile_image_url'],
                     ['user', 'friends_count'], ['user', 'followers_count'],
                     ['user', 'statuses_count']];

这样的指定,以后也很方便添加新的属性
2: 对于从API获得的每个status对象,将一个属性的值放在一起,最后行程一个javascript对象
{
  'id': [111, 222, ...],
  'name': ['tom', 'jacky', 'mike', ...],
  'profile_image_url': [...]
  ...
}

对象的每个字段值是个等长的数组。
3: 由于我们知道字段名字的顺序,仅有的字段名字都可以省略, 变成如下结构,然后传送给客户端
[
  [111, 222, ...],
  ['tom', 'jacky', 'mike', ...],
  [...]
  ...
]

接收端根据约定好的字段进行解码就可以使用了。只要约定不出问题,就不会导致数据混乱。
由于node-fanfou是使用nodejs编程的,服务器端也使用javascript, 所有我偷了个巧,一个定义字段的文件同时被客户端和服务器端使用,就不需要考虑分发和修改的问题了。

结果是一个30K大小左右的timeline经过以上编码,尺寸变为6K字节大小。而gzip -9 压缩后2.6K字节大小,能有效缩小传输尺寸一半以上。

对于纯客户端开发者,也建议使用网站来缓冲微博网站的API, 压缩尺寸。这样对于用户体验提升有很大帮助。

再顺便说下node-fanfou, 这是一个饭否的实验性移动互联网网站,主要使用的技术有 css3, html5 localStorage, backbone.js, jquery还有服务器端的nodejs. 源代码在 https://github.com/FanfouAPI/node-fanfou 。欢迎参看.





    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3