转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dca68cdda2212dec4d86c0&scene=21#wechat_redirect

今天是冯建同学投稿。总结他在Android开发方面的各种小经验,我认为很有意义,所谓经验丰富有时候是指积累的这些小经验许多,他这篇分享相信会帮助到一些朋友。我也曾推荐过他的 APK魔鬼瘦身
一文。没看过的朋友也能够再去看看。

做Android久了,就会踩非常多坑,被坑得多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录。

查看SQLite日志



由于实现里用了Log.isLoggable(TAG, Log.VERBOSE)做了推断,在LessCode的LogLess中也參考了这样的机制:https://github.com/openproject/LessCode/blob/master/lesscode-core/src/main/java/com/jayfeng/lesscode/core/LogLess.java

使用这样的方法就能够在Release版本号也能做到查看应用的打印日志了。

PNG优化

APK打包会自己主动对PNG进行无损压缩,假设自行无损压缩是无效的。

当然进行有损压缩是能够的:https://tinypng.com/

Tcpdump抓包

有些模拟器比方genymotion自带了tcpdump,假设没有的话,须要下载tcpdump:

http://www.strazzere.com/android/tcpdump

把tcpdump push到/data/local下。抓包命令:

查看签名

非常多开发人员服务都须要绑定签名信息,用以下的命令能够查看签名:

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

注意,这个是须要password的,能够查看MD5, SHA1。SHA256等等。

单例模式(懒汉式)的最佳写法

特别讲到这个问题。是由于网上非常多这种代码:

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

这样的写法线程不安全,改进一下,加一个同步锁:



网上这种代码很多其它。能够非常好的工作,可是缺点是效率低。

实际上。早在JDK1.5就引入volatilekeyword,所以又有了一种更好的双重校验锁写法:



这才是最佳写法!

。!

不是说另外一种写法有问题,或者在Android中一定要用第三种写法。仅仅是告诉大家一种更好的写法。

多进程Application

是不是常常发现Application里的方法运行了多次?百思不得其解。

由于当有多个进程的时候。Application会运行多次,能够通过pid来推断那些方法仅仅运行一次,避免浪费资源。

隐式启动Service

这是Android5.0的一个修改。不支持隐式的Service调用。以下的代码在Android 5.0+上会报错:Service Intent must be explicit:



可改成例如以下:

fill_parent的寿命

在Android2.2之后,支持使用match_parent。你的布局文件中是不是既有fill_parent和match_parent显得非常乱?

假设你如今的minSdkVersion是8+的话。就能够忽略fill_parent。统一使用match_parent了,否则请使用fill_parent。

ListView的局部刷新

有的列表可能notifyDataSetChanged()代价有点高,最好能局部刷新。

局部刷新的重点是,找到要更新的那项的View,然后再依据业务逻辑更新数据就可以。



强调一下。最后那个列表数据别忘记更新, 不然数据源不变。一滚动可能又还原了。

系统日志中几个重要的TAG

一行居中,多行居左的TextView

这个一般用于提示信息对话框,假设文字是一行就居中。多行就居左。

在TextView外套一层wrap_content的ViewGroup就可以简单实现:

setCompoundDrawablesWithIntrinsicBounds()

网上一大堆setCompoundDrawables()方法无效不显示的问题,然后解决方法是setBounds。须要计算大小…

不用这么麻烦,用setCompoundDrawablesWithIntrinsicBounds()这种方法最简单!

计算程序执行时间

为了计算一段代码执行时间,一般的做法是,在代码的前面加个startTime,在代码的后面把当前时间减去startTime,这个时间差就是执行时间。

这里提供一种写起来更方便的方法。全然无时间逻辑。仅仅是加一个打印log就够了。



没有计算时间的逻辑,这能測出来?

把日志过滤出来,执行命令“adb logcat -v time | grep TAG”:



通过-v time參数,能够比較日志左边的时间来算出中间的代码执行的时间。

Java引用类型一览表

Context使用场景

为了防止Activity,Service等这种Context泄漏于一些生命周期更长的对象,能够使用生命周期更长的ApplicationContext,可是不是全部的Context的都能替换为ApplicationContext

这是网上流传的一份表格:

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

图片缓存大小

如今非常多图片库须要给图片设置一个最大缓存。可是这个值设置多少合适呢?

高端机和低端机的配置显然应该不同,能够考虑设置一个动态值。

建议设置为应用可用内存的1/8:

系统内置的一些工具类

在AOSP源代码全局搜了一下包括Utilkeyword的类。整理出这个列表供大家參考:

这么多工具类,一定能够找到对你实用的。

ClipPadding

这个不多说,ListView的ClipPadding设为false。就能为ListView设置各种padding而不会出现丑陋的滑动“禁区”了。

强大的dumpsys

dumpsys能够查看系统服务和状态,很强大,可通过例如以下查看全部支持的子命令:

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

这里列举几个略微经常使用的:

bugreport命令

非常多人都用过adb logcat,可是假设想要更具体的信息,logcat则无能为力。

所以大多数手机厂商測试很多其它的是用adb bugreport来抓log给开发者分析。

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

dpi目录的换算比例

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

更新媒体库文件

曾经做ROM的时候常常碰到一些第三方软件(某音乐APP)下载了新文件或删除文件之后,可是媒体库并没有更新,由于这个是须要第三方软件主动触发。

wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1" alt="" style="margin:0px; padding:0px; height:auto!important; max-width:100%; word-wrap:break-word!important; width:auto!important; visibility:visible!important">

媒体库会在手机启动。SD卡插拔的情况下进行全盘扫描,不是实时的并且代价比較大,所以单个文件的刷新非常有必要。

Monkey參数

大家都知道,跑monkey的參数设置有一些要注意的地方,比方太快了不行不切实际,太慢了也不行等等。这里给出一个參考:



一边跑monkey,一遍抓log吧。

小结

不管是大经验还是小经验,都是好经验,关键时候出奇效。

Android小经验的更多相关文章

  1. 你应该知道的那些Android小经验

    原文出处:http://jayfeng.com/ 做Android久了,就会踩很多坑,被坑的多了就有经验了,闲暇之余整理了部分,现挑选一些重要或者偏门的“小”经验做个记录. 查看SQLite日志 ad ...

  2. Android小经验:启动Eclipse,出现提示“......发现了以元素'd:skin'开头的无效内容。此处不应含有子元素...”

    如图所示: 解决办法: 进入sdk目录下,把D:\android-sdks\system-images\android-22\android-wear\armeabi-v7a\devices.xml和 ...

  3. Android开发的16条小经验总结

    Android开发的16条小经验总结,希望对各位搞Android开发的朋友有所帮助. 1. TextView中的getTextSize返回值是以像素(px)为单位的, 而setTextSize()是以 ...

  4. 一个简单的Android小实例

    原文:一个简单的Android小实例 一.配置环境 1.下载intellij idea15 2.安装Android SDK,通过Android SDK管理器安装或卸载Android平台   3.安装J ...

  5. android小程序之幸运菜谱

    android小程序之幸运菜谱 前言:刚刚结束短短5天的android公开课程,收获不少,写下来记录一下吧!(因为学校校企公开课的缘故才偶然接触的android,所以只学了这几天,不喜勿喷) 一开始得 ...

  6. android小程序-电子钢琴-多点触控

    我在第一篇博客<android小程序-电子钢琴-滑动连续响应>中实现了一个简单地7键钢琴,这几天把它又完善了一下,增加了多点触控,按键也增加了一个低音区和一个高音区,使得又可以多弹一点简单 ...

  7. android小游戏模版—重力感应

               好久没更新博客了,今天来谈谈android小游戏---重力感应,一般在游戏里运用的比較多,比方这类游戏有:神庙逃亡.极品飞车,平衡球.三围重力迷宫,重力赛车等. 首先什么是重力感 ...

  8. gulp+webpack+angular1的一点小经验(第二部分webpack包起来的angular1)

    又一周过去了,项目也已经做得有点模样了.收集来一些小经验,分享给大家,有疏漏之处,还望指正,海涵. 上周整合了gulp与webpack,那么工具准备差不多了,我们就开始编码吧.编码的框架就是angul ...

  9. 分享调试SI4432的一些小经验(转)

    分享调试SI4432的一些小经验 最近使用 STM8F103 + SI4432 调无线,遇到问题不少,此处有参考过前辈的经验: 1.硬件把板给到我时USB烧录线带供电(5V),此供电接到LDO输出,就 ...

随机推荐

  1. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  2. Volitale

    例1 volatile提醒编译器它后面所定义的变量随时都有可能改变.因此编译后的程序每次须要存储或读取这个变量的时候,都会直接从变量地址中读取数据. 假设没有volatile关键字.则编译器可能优化读 ...

  3. 目标决定人生——没有目标就失去一切 (没有目标的奋斗是浪费青春,比如交了钱却不去参加考试、让时间白白溜走。根据目标与定位来选择最合适的企业。人生要算总账)good

    没有目标就失去一切 刚毕业那会儿,幼稚得可笑,老跟同学打电话,明面上聊聊近况,暗地里比较.你要比我工资多一百块,心里特不平衡,凭什么呀,在学校那会儿公认的我比你强.你要带个头衔,而我啥也不是,普通员工 ...

  4. JS实现队列效果,先进先出

    /** * [Queue] * @param {[Int]} size [队列大小] */ function Queue(size) { var list = []; //向队列中添加数据 this. ...

  5. 47.Express文件上传

    转自:http://www.runoob.com/nodejs/nodejs-express-framework.html 文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 e ...

  6. 学大伟业Day解题报告

    预计分数:30+30+0=60 实际分数:30+20+0=50 题解部分全部来自http://www.cnblogs.com/TheRoadToTheGold/p/7723564.html T1htt ...

  7. go 可以开发桌面应用

    go 可以开发桌面应用 go 可以开发桌面应用,但并不是很舒适.可以使用的GUI库有:1.goqt,LiteIDE作者出品,Go和QT的绑定,还未发布2.go.uik,纯Go实现的并发UI工具3.wa ...

  8. deep-in-es6(四)

    不定参数和默认参数: function containsAll(str) { for(var i = 1;i < arguments.length;i++) { var hasStr = arg ...

  9. Gym - 100502A Amanda Lounges

    Amanda Lounges Time Limit: 1000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u AMAN ...

  10. Hibernate之关于多对多单向关联映射

    [Hibernate]之关于多对多单向关联映射 老师和学生,最典型的多对多关联, Teacher和Student.所谓单向意思就是说.老师知道自己的教的是哪些学生而学生不知道是哪些老师教. 也能够这么 ...