
前言
作为一个有两、三年Android应用开发经验的码农,自然会遇到很多坑,下面是我能够想起的一些坑(实践证明不记笔记可不是个好习惯),后面有想到其它坑会陆续补上。
此文纯粹总结开发Android以来遇到的一些坑,一来为了防止再次掉坑,二来是希望后面的朋友能躲开这些坑。
开发中那些可能会遇到的坑
1、不要排斥新技术和新工具
Android Studio 3.5 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。JetBrains的IDE,用过都说好。
还有就是适当的提升targetSdkVersion到新版本。
2、代码设计方面的问题,大部分都能在Android系统源码里找到解决方案
当你想设计一个新模块,或者实现一个新ui组件的时候,应该采用哪些设计模式、应该以哪种形式给外界提供接口之类的问题,大部分都可以参考Android系统的源码,找到实现方式。Google为安卓程序员提供了一座现成的宝库。
3、理解Android和Java内存管理方式,至少要理解垃圾回收和Java的引用
就好比学OC就要先理解黄金法则一样,而java的内存管理,其实比OC要好理解多了。 这可能会帮助你大大减少程序异步操作产生的空指针崩溃。也会帮助你理解为什么滥用单例模式会导致内存的臃肿。还会帮助你养成不用“+”去连接超大字符串的好习惯。
4、ContentProvider并不是只有在跨进程共享数据的才有用,把数据库表映射到一个独立的uri是Google鼓励的实现方式
从设计上讲,用uri(统一资源标识符)去描述数据,肯定比sql语句要理想。从效果上讲,用CursorLoader读取数据是让iOS程序员都羡慕不已的事情,作为android程序员,何苦不用呢。
5、理解Activity任务栈
非Activity的Context对象如果直接启动Activity会报错,这只是一个表面现象,真正起作用的其实是Activity任务栈机制。
理解Activity任务栈机制以及Activity的各种启动方式,会帮助解决大部分页面关系错乱问题,以及应用互相掉起、任务栏进入应用、后台弹窗引起的各种问题。
6、对于一些奇葩的第三方ROM,调用其非主流api的时候,可以使用反射
在适配一些第三方ROM的的时候,调用一些在开发环境中没有,但在运行环境中有的方法时,可以使用反射。比方说,华为双卡手机可能会提供获取第二块SIM卡信息的api,如果直接调用,在开发环境可能无法通过正常编译,用反射就没问题。这属于不得已而用反射的一种情况。
7、SQLite的锁,是数据库级别的锁,也就是说同一个数据库的写操作无法并发执行
所以,在数据库设计的时候,如果表太多,尽量将没有关联的表拆到多个数据库文件中。
8、Bitmap的内存占用问题
这是一个困扰2.X时代android程序员的问题。
2.X时代Bitmap对象虽然存储在堆内存中,但是用了一个byte数组存储其像素信息。通过计数器来记录该像素信息被引用的个数。有人认为这个byte数组在native堆中,但事实上它也在堆中。
只有在使用者调用recycle()后,Bitmap对象才会释放像素信息,才会在失去引用后,被垃圾回收机制销毁。再加上DVM的heap size有严格的阀值,所以在使用大量图片资源的时候,及其容易发生OOM。
解决办法一般都是,用一个哈希表存储Bitmap对象的软引用,作为内存缓存,并在适当时机掉用其recycle()。
3.0以上版本Bitmap对象可以通过垃圾回收机制完全销毁,理论上不用再调用recycle()。
之前遇到过的坑
说几个之前遇到过的坑(大神们轻笑):
1、假使AActivity已经启动(对应的启动Intent为intent1),此时调用startActivity(intent2)再次启动AActivity,在onResume()中调用getIntent()获取到的Intent仍然是intent1,除非重写onNewIntent()方法:

2、ViewPager的子控件个数(getChildCount())最多为3(默认setOffscreenPageLimit(1),在destroyItem()中调用了removeView()),如果要获取ViewPager某个子页面,千万不能使用getChildAt(position),会造成数组越界。可以通过:

来获取。
3、自定义View为内部类时,如果需要在xml文件中使用,该View必须为静态内部类,当然这不是重点,重点是xml中必须使用view作为节点:

4、使用属性动画(Property Animation)中的位移类动画时,对layout根节点的控件(ll_outer)无效:

5、HONEYCOMB以上使用混合渲染器ComposeShader无效,可能和硬件加速有关,使用drawable设置的虚线效果无效也可能是硬件加速的原因。
6、使用hide()与show()来切换Fragment时,Fragment的生命周期方法都不会被调用,除了onHiddenChanged()。
7、自定义SeekBar thumb的问题,代码如下:
android:thumb="@drawable/sb_thumb"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/sb_thumb_disabled" android:state_enabled="false" />
<item android:drawable="@drawable/sb_thumb_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/sb_thumb_focused" android:state_selected="true" />
<item android:drawable="@drawable/sb_thumb_normal" />
</selector>
但是效果是这样的:

需要计算thumbOffset大小并设置才能正常显示。
8、CheckBox设置文本时的显示问题,我就传几张图不说话,呵呵……



9、使用MediaPlayer播放网络视频时,如果网络不好会一直加载,点击返回可能ANR、锁屏可能ANR、随意拖动进度条也可能ANR,不得不说Android媒体这一块做的实在不够好。
10、默认一个应用对应一个进程,在AndroidManifest.xml文件中给组件添加android:process属性后(比如友盟推送:android:process=":push"),应用会对应多个进程,Application会被创建多次,此时内存中的数据都不能共享(即便是静态的成员)。
11、Fragment千万不能设置成非静态内部类,因为Activity恢复状态时会通过反射的方法实例化Fragment。
最后
如果你的知识是一个圆,当你的圆越大时,圆外面的世界也就越大。
如果你不知道怎么学习,我给大家提供一个方向,进行体系化的学习!

除了上面的学习路线,还给大家整理了一份Android进阶学习资料,主要为安卓相关知识点及面试资料为主,在这个PDF中,通过详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好的,这里也有一份安卓基础资料包,帮助巩固基础。
以下是这份PDF主要内容:
- Android 核心技术:介绍 Android 开发中常用的核心技术,比如自定义 View、Handler,以及一些开源框架的原理实现,来夯实你的底层能力。只有底层能力足够出色,之后的进阶之路才会更加轻松。
- 常见问题剖析:介绍一些项目中常见的疑难问题,使你能够对现有项目做出合理的重构优化。

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
这里附上针对字节跳动的面试题整理的合集,我们进行了分类,循序渐进,由基础到深入,由易到简。
将内容整理成了五个章节:
计算机基础面试题、数据结构和算法面试题、Java面试题、Android面试题、其他扩展面试题、非技术面试题总共五个章节354页。

还有一份Android开发相关源码解析,这份Android学习PDF大全真的包含了方方面面了
内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等486页超全面Android开发相关源码精编解析

字节跳动真题解析、Android开发相关源码解析、简历模板可以【简信】我免费获取
面试时HR也是不可以忽略的环节,我们经常也会遇到很多关于简历制作,职业困惑、HR经典面试问题回答等有关面试的问题。
有全套简历制作、春招困惑、HR面试等问题解析参考建议。

这些都是我闲暇还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,以上资源均免费分享,以上内容均放在了开源项目:【github】中已收录,大家可以自行获取(或者关注主页扫描加微信获取)。
一些心里话
随着年龄的增长意味着我们的时间也越来越少了,所以我们自己心里要明白自己该做什么?
浑浑噩噩,最后自己只会被淘汰。
当然,我们程序员,最大的底气就是技术!
所以,如果你只想在技术这条路上越走越远,一定要进阶,迈上一个高的台阶!
希望我们在开发的路上越走越远,一起来进阶吧。
偏执的我们可能不一定能够总是被理解,但是我们总是能够创造我们的价值。
网友评论