Android 开发中,有哪些坑需要注意?

2,589 阅读4分钟
原文链接: zhuanlan.zhihu.com

最近正准备写一篇关于这方面的文章,正好看到知乎上的这个问题:Android 开发中,有哪些坑需要注意? - Android,索性以写答案的方式来写这篇文章,顺便推荐我之前在知乎上提出的一个问题:在Android开发的过程中,有哪些坑是值得你放在checklist中警示自己的? - 程序员[1],里面有一些有参考价值的答案。

作为一个有三、四年Android应用开发经验的码农,自然会遇到很多坑,下面是我能够想起的一些坑(实践证明不记笔记可不是个好习惯),后面有想到其它坑会陆续补上。

  • 同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑;
  • Android的JNI代码中,有返回类型的函数没有返回值编译的时候也不会报错;
  • 当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;
  • 谨慎使用Android的透明主题,透明主题会导致很多问题,比如:如果新的Activity采用了透明主题,那么当前Activity的onStop方法不会被调用;在设置为透明主题的Activity界面按Home键时,可能会导致刷屏不干净的问题;进入主题为透明主题的界面会有明显的延时感;
  • 不要在非UI线程中初始化ViewStub,否则会返回null;
  • 公共接口一定要考虑到代码重入的情况,能设计为单例就尽量用单例;
  • 不要通过Bundle传递大块的数据,否则会报TransactionTooLargeException异常:java - Issue: Passing large data to second Activity[5]
  • 尽量不要通过Application缓存数据,这不稳定:不要在Android的Application对象中缓存数据![6]
  • 尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错;
  • 9图不能通过tinypng压缩,不然会有问题;
  • genymotion模拟器快是因为它是基于x86架构的,如果你的应用中用到了so,但没有x86架构的so,只能放弃使用它;Android Studio的模拟器也一样;
  • Eclipse的Android开发环境配置好后不要轻易升级ADT和build tools,不然会浪费你很多时间,还有就是一个workspace中的工程不要太多,不然每次启动都会很慢;
  • Android studio每个版本、gradle每个版本差别都比较大(我是这样认为的),对于jni代码的编译建议在Eclipse中进行,如果在Android studio中开发jni会浪费很多时间,主要是编译脚本的配置比较麻烦;
  • Eclipse中的Lint太不靠谱,特别是主工程中依赖library的时候,很多提示都是有问题的,建议使用Android Studio的工程清理工具,特别推荐。
  • AsyncTask默认自己维护一个静态的线程池,而该线程池只允许同时执行一个线程,也就是说,不管多少个AsyncTask,只要是调用execute()方法,都是共享这个默认进程池的,你的任务必须在之前的任务执行完以后,才能执行。调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案[7]

能力有限,有些坑可能本身不是坑,只是自己没有处理好,再加上知识面有限,若有疑义,欢迎在评论区沟通交流。