作者:张明云

原标题:Android 开发中,有哪些坑需要注意?

作者github主页:zmywly8866.github.io/

  • 在Android library中不能使用switch-case语句访问资源ID:在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

  • 不能在Activity没有完全显示时显示PopupWindow和Dialog:popupwindow - Problems creating a Popup Window in Android Activit

  • 在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定:android - MODE_MULTI_PROCESS for SharedPreferences isn't working

  • 有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等):

  • 同一个应用的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

  • 尽量不要通过Application缓存数据,这不稳定:不要在Android的Application对象中缓存数据!

  • 尽量不要使用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的工程清理工具,特别推荐;

  • 不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案

  • 同一个应用,相同的图片分别放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi中,在同一设备中占用的内存会大不一样(设备的dpi是固定的,图片放在不同的dpi文件夹下,在设备上显示时需要将图片转换成和当前屏幕一样dpi后在设备中显示,所以即使该图片在不同dpi文件夹下大小一样,但放在内存中的大小却不是一样的,并不一定是长*宽*4),做应用的内存优化之前可以先看一看你的工程是如何做屏幕适配的,是否有优化的空间。强烈推荐这个屏幕适配视频教程,花两个半小时就能看完:Android-屏幕适配全攻略

  • 谨慎对待数据库升级(比如需要在原数据库中增加字段),避免数据丢失或者操作数据库异常的情况,数据库升级方法可以查阅《第一行代码》P263;

  • 多个程序共用一套代码(一套代码,在桌面上多个图标)时需要处理好不同入口进入时的堆栈问题;

  • 使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView的方法中无论这项的每个视图是否需要设置属性(比如TextView设置的属性可能为null,item的某一个按钮的背景为透明、某一项的颜色为透明等),都需要为每一项的所有视图设置属性(textview的属性为空也需要设置setText(""),背景透明也需要设置),否则在滑动的过程中会出现内容的显示错乱。

  • 谨慎使用Android的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:(1)不能实现完全退出所有Activity的功能(如果有同行在应用内采用多进程成功实现过完全退出程序欢迎沟通交流);(2)首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏还是黑屏和新Activity的主题有关);(3)应用内多进程时,新启动一个进程都会重新跑一次Application的onCreate方法,不上重新创建一个Application,但会重新跑Application的onCreate,这样就不能在Application中缓存数据作为内存共享的途径了;(4)多进程间通过SharedPreferences共享数据时不稳定,具体可以查阅《Android开发艺术探索》。

  • 使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况(如果你有连续弹出Toast的情况,避免使用Toast.makeText);

关于更多Android开发方面的文章,可以看看我的专栏:张明云的知识共享 - 知乎专栏

知识面有限,有很多没有深入理解的知识点,欢迎指正交流~~~

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:张明云
链接:http://www.zhihu.com/question/27818921/answer/70279930
来源:知乎

转载于:https://www.cnblogs.com/rainey-forrest/p/4945730.html

Android开发文摘集合1相关推荐

  1. Android开发工具集合

    Android Studio Android开发环境,基于IntelliJ IDEA,谷歌2013年I/O大会发布,类似 Eclipse ADT:现已更新到1.3版本(截止15年8月),并支持NDK开 ...

  2. Android 开发工具集合 - (Android Dev Tools)

    收集整理Android开发所需的Android SDK.开发中用到的工具.Android开发教程.Android设计规范,免费的设计素材等. 欢迎大家推荐自己在Android开发过程中用的好用的工具. ...

  3. Android 开发工具集合

    1.XAppDbg XAppDbg是一个可以在运行中改变代码中参数的一个应用开发工具.这个工具可以为你省下大量的时间,因为你不用为应用的每次小改变而重新编译运行你的程序. 2.ChkBugReport ...

  4. Android 开发知识集合目录

    深入理解java的形参和实参: www.cnblogs.com/xuxinstyle/- sharepreference 与 数据库 区别: Android 各版特点: Android发展史(Andr ...

  5. 老罗Android开发视频教程( android解析json数据 )4集集合

    老罗Android开发视频教程( android解析json数据 )4集集合 老罗Android开发视频教程( android解析json数据 ) 第一集android解析json数据 http:// ...

  6. Android开发笔记(九十六)集合动画与属性动画

    集合动画AnimationSet 补间动画有四大类:透明度动画AlphaAnimation.旋转动画RotateAnimation.缩放动画ScaleAnimation.平移动画TranslateAn ...

  7. 用于Android开发的免费类库和工具集合

    用于Android开发的免费类库和工具集合,按目录分类. Action Bars ActionBarSherlock Extended ActionBar FadingActionBar GlassA ...

  8. Android开发:开源库集合

    开源库大全 目录 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 ViewPager 图表(Chart) 菜单(Men ...

  9. Android开发工具类集合

    各种帮助类汇总:https://github.com/Blankj/AndroidUtilCode 常用的 ios 风格 dialog 和 meterial design 风格的 dialog:htt ...

  10. android系列:第一篇 android开发常用命令集合,代码目录简介

    下面整理了android开发常用命令集合如adb命令,adb over wifi,jgrep等代码搜索命令,编译环境变量配置,lunch平台选择,mm模块编译,godir代码路径跳转,log.v()等 ...

最新文章

  1. Facebook 如何管理150亿张照片
  2. windows下的_mkdir函数
  3. Python | 如何使用pip升级所有Python软件包?
  4. 腾讯视频怎么禁止别人登录我的会员
  5. mysql pom.xml版本号_maven的pom.xml的依赖,什么情况下可以不写版本号?
  6. node ajax validator,node/express 4:在ajax post上使用express-validator显示错误
  7. Java GC 原理
  8. Eclipse srever起来时,时间超过45s。
  9. modelsim安装_Modelsim10.5安装教程
  10. win7下dynamips类模拟器桥接到本地PC,但是无法ping通的解决办法
  11. cpc客户端网络不通
  12. minist数据集的获取方法
  13. RedHat7 安装 MySQL 5.7
  14. Windows 10图标如何调整?
  15. mysql 修改校对规则,整合MYSQL校对规则
  16. 百度谷歌雅虎三大搜索引擎本土功能大PK
  17. 《感冒+发烧》后的感受
  18. 【整活】修改U盘的图标,让你的U盘与众不同
  19. 启用系统保护是灰色的#win10系统
  20. gpt mac linux window guid type,parted解决超大容量磁盘分区 GPT分区表

热门文章

  1. Android异常总结---3.Failed to install *.apk on device 'emulator-5554': timeout 错误提示:
  2. 自动垃圾回收学习笔记-我们为什么需要自动垃圾回收
  3. 【读书笔记】代理模式代码(C#)
  4. 执行查看linux端口命令 9083 端口发现被占用 Hive安装过程遇到的问题
  5. 破世界纪录了0.74秒!用代码实现自动扫雷!
  6. 面试官:有没有比读写锁更快的锁?
  7. 一行代码让纯文本编辑器秒变 Markdown 编辑器
  8. 免费自学编程的12个网站
  9. 首席架构师眼中的架构应该是怎样的?
  10. 手把手教你 3 个 Linux 中快速检测端口的小技巧