文档章节

Android开发中的一些技术经验

h
 hahazy
发布于 2016/03/01 16:30
字数 3080
阅读 4
收藏 0
点赞 1
评论 0

1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效。

2. 数据库表段字段常量和SQL逻辑分离,更清晰,建议使用Lite系列框架LiteOrm库,超级清晰且重心可以放在业务上不用关心数据库细节。

3. 全局变量放全局类中,模块私有放自己的管理类中,让常量清晰且集中.

4. 不要相信庞大的管理类的东西会带来什么好处,可能是一场灾难,而要时刻注意单一职责原则,一个类专心做好一件事情更为清晰。

5. 如果数据没有必要加载,数据请务必延迟初始化,谨记为用户节省内存,总不会有坏处。

6. 异常抛出,在合适的位置处理或者集中处理,不要搞的到处是catch,混乱且性能低,尽量不要在循环体中捕获异常,以提升性能。

7. 地址引用链长时(3个以上指向)小心内存泄漏,和警惕堆栈地址指向,典型的易发事件是:数据更新了,ListView视图却没有刷新,这时Adapter很可能指向并的并不是你更新的数据容器地址(一般为List)。

8.信息同步:不管是数据库还是网网络操作,新插入的数据注意返回ID(如果没有赋予唯一ID),否则相当于没有同步。

9.多线程操作数据库时,db关闭了会报错,也很可能出现互锁的问题,推荐使用事务,推荐使用自动化的LiteOrm库操作。

10.做之前先考虑那些可以公用,资源,layout,类,做一个结构、架构分析以加快开发,提升代码可复用度。

11. 有序队列操作add、delete操作时注意保持排序,否则你会比较难堪喔。

12. 数据库删除数据时,要注意级联操作避免出现永远删不掉的脏数据喔。

13. 关于形参实参:调用函数时参数为基本类型传的是值,即传值;参数为对象传递的是引用,即传址。

14. listview在数据未满一屏时,setSelection函数不起作用;ListView批量操作时各子项和视图正确对应,可见即所选。

15 控制Activity的代码量,保持主要逻辑清晰。其他类遵守SRP(单一职能),ISP(接口隔离)原则。

16. arraylist执行remove时注意移除int和Integer的区别。你懂得。

17. Log请打上Tag,调试打印一定要做标记,能定位打印位置,否则尴尬是:不知道是哪里在打印。

18. 码块/常量/资源可以集中公用的一定共用,即使共用逻辑稍复杂一点也会值得,修改起来很轻松,修改一种,到处有效。

19. setSelection不起作用,尝试smoothScrollToPosition。ListView的LastVisiblePosition(最后一个可见子项)会随着getView方法执行位置不同变动而变。

20.与Activity通讯使用Handler更方便; 如果你的框架回调链变长,考虑监听者模式简化回调。

21.监听者模式不方便使用时,推荐EventBus框架库,使用时间总线,没接触过的同学可以自行脑补一下哦。

22. Handler在子线程线程使用Looper.prepare,或者new的时候给构造函数传入MainLooper来确保在主线程run。

23. timepicker 点击确定后需要clearFocus才能获取手动输入的时间。

24. 构造函数里面极度不推荐启动异步线程,会埋下隐患。比如:异步线程调用了本例的示例,就会悲剧等着崩溃吧。

25. 千万不要理所当然的以为一个对象不会为空,充分的做好容错处理;另外注意null也可以插入ArrayList等容器中。

26. ExpandableListView的子列表不能点击(禁用)要把Adapter的isChildSelectable方法返回true。

27. UI显示注意内容过长的情形要提前使用ScrollView否则在小手机上尴尬你懂得。

28. 注意按钮的感应范围不小于9mm否则不易点击;输入框注意光标的位置更易用户输入。

29. 服务器和客户端尽量统一唯一标识(有可能是ID),否则多少会有歧义和问题。

30. 注释,尽量去写足够的注释,去描述一下思路,达到看了可以明白某一块代码的效果。

31. 完整型数据一定要用Sqlite的Transaction,大数据一定要用。粗略测试插入100个数据有20倍的提速,插入1000个数据就有100多倍的提速。

32. 避免String=”null”的情况出现String = null,=””都可以。避免出现title=”无主题”这样的数据提交到数据库浪费空间。

33. 存在多个不同的dbhelper实例情况下,sqlitedatabase对象必然存在不同的实例,多线程同时写入数据,轮流写入数据时会不定时的报db is locked,引起崩溃,不管是操作同张表还是异表。读和写可以同时并发,轮流无规律的交替执行。同时写入数据时解决方案是用并发的每个线程都用事务,db则不会lock,按次整体写入。

34. 建议整个应用维护一个dbhelper实例,只要db没有关闭,全局就只有一个db实例,多线程并发写入db不会lock,严格交替进行写入:123123123。。。(123代表不同线程,轮流插入一个记录),读和写均不会锁住db,读写交替并没有规律,执行次数和程度看cpu分配给哪个线程的时间片长。

35. 一个任务使用事务嵌套N个事务,N个事务中有一个失败,这个任务整体失败,全部成功后,数据才写入,具有安全性,整体性。并且事务写入大批量数据的效率经实际测试成百上千倍的高于一般的单个写入。数据库大量数据、多线程操作建议使用LiteOrm数据库框架,更稳定简单。

36. 经常需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。

37. Long a; 判断a有没有赋值,if(a == 0)在a没有赋值情况下会报错。应该if(a == null),Integer、Floag等也一样,原因你懂,只是提醒你要小心喔。

38. 编码遇到读写、出入等逻辑要双向考虑,文件导入导出,字符字节相互转换都要两边转码。

39. 一个 int 值与一个 Integer 对象(能包含 int 值的最小对象)的大小比率约为 1:4(32位和64位机器有不同)。额外的开销源于 JVM 用于描述 Java 对象的元数据也就是 Integer,(Long、Double等也是)。

40. 对象由元数据和数据组成。元数据包括类(指向类的指针,描述了类的类型),标记(描述了对象状态,如散列码、形状等),锁(对象同步信息)。数组对象还包括大小的元数据。

41. 一个在 32 位 Java 运行时中使用 1GB Java 堆的 Java 应用程序在迁移到 64 位 Java 运行时之后,通常需要使用 1.7GB 的 Java 堆。

42. Hash 集合的访问性能比任何 List 的性能都要高,但每条目的成本也要更高。由于访问性能方面的原因,如果您正在创建大集合(例如,用于实现缓存),那么最好使用基于 Hash 的集合,而不必考虑额外的开销。

43. 对于并不那么注重访问性能的较小集合而言,List 则是合理的选择。ArrayList 和 LinkedList 集合的性能大体相同,但其内存占用完全不同:ArrayList 的每条目大小要比 LinkedList 小得多,但它不是准确设置大小的。List 要使用的正确实现是 ArrayList 还是 LinkedList 取决于 List 长度的可预测性。如果长度未知,那么正确的选择可能是 LinkedList,因为集合包含的空白空间更少。如果大小已知或可预知或比较小,那么 ArrayList 的内存开销会更低一些。

43. 选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡。除此之外,你可以通过正确调整集合大小来最大化填充率、最小化未得到利用的空间,从而最大限度地减少内存占用。

44. 充分利用封装(提供接口类来控制访问数据)和委托(helper对象来实施任务)两种理念。

45. 延迟分配 Hashtable:如果 Hashtable 为空是经常发生的普遍现象,那么仅在存在需要存储的数据时分配 Hashtable 应该是一种合理的做法。将 Hashtable 分配为准确的大小:虽然会有默认大小,但建议使用更为准确的初始大小。

46. EditText在setText时不要忘记是否需要setSelection。在大多数情况下是需要设置的。

47. XML两种情况要注意:1 属性名字时候有重复;2 注意文本是否包含非法字符,注意使用CDATA包裹。

48. 当逻辑没有明显问题时考虑对象属性、函数参数、网络传输参数是否全部了解,是否设置正确。

49. 当出现编译或者运行时错误,别人那没问题时,考虑你的编译环境和环境版本是否有问题。

50. 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuilder提升性能,多线程使用StringBuffer操作string提高程序效率。

51. java 栈的优势是比堆速度快,可共享,主要存放临时变量、参数等,堆的优势是可动态分配内存大小。

52. 只要是用new()来新建对象的,都会在堆中创建,而且其数据是单独存值的,即使与栈中的数据(值)相同,也不会与栈中的数据共享。

53. 基本数据类型定义的变量称自动变量,存的是‘字面值’,存在于栈中,可共享(存在即不新建)。

54. 多个RandomAccessFile对象指向同一个文件,可使用多个线程一起写入无需再自己加锁,经试验结论:三个线程分别写入100万次数据,使用锁约12秒,不使用约8.5秒。100个线程分别写入1万次数据使用锁耗时约4.2秒,不使用锁耗时约3秒。

55. XmlPullParser解析慎用nextText()方法,xml比较复杂,含有空标签、重复名字标签时容易出现异常问题;TEXT中使用getText()方法代替START_TAG中使用nextText()方法;START_TAG,TEXT,END_TAG三个事件配合使用。注意每个xml节点之间(不管是开始节点还是结束节点)都会出现TEXT事件。

56. 改变逻辑的时候考虑全部用到这项功能的地方,分散的地方多了,容易大意。

57. 当系统原生组件出现问题时,查看错误栈信息,自己写一个该组件的子类,并在合适的地方将出错方法复写一下,加上try catch保证不崩溃掉。不要扰乱了该系统控件的正常逻辑。

58. 输入控件注意对空格、换行等符号的控制;输入框里内容注意和左右控件的空间,防止误点击。

59. 注意函数参数里的++或者–操作。是++c 还是 c++,区别很大。

60. 各种地方、永远的不要小看null指针问题,甚至有些场合宁可错杀(try catch),不可放过。

本文转载自:http://www.devstore.cn/essay/essayInfo/5565.html

共有 人打赏支持
h
粉丝 0
博文 1
码字总数 0
作品 0
常州
AndroidThings之基础一 基本概念

转载自:https://blog.csdn.net/weixin41636248/article/details/79069994 Android Things是什么 一句话说,AndroidThings就是让开发者可以使用Android开发工具开发嵌入式设备。 If you can...

qq_28831197 ⋅ 05/09 ⋅ 0

仓库pda app开发,android系统

任务描述: 仓库pda app开发android系统,我方出接口 开发周期: 1.兼职时间:20~30个工作日。 2.兼职人员要求深圳地区,坐班 人员要求: 1. 两年以上Android开发经验。 2. 沟通能力较强 3....

封生 ⋅ 05/16 ⋅ 0

高手问答第 198 期 — Android 十年,一起深入剖析 Android 新特性

OSCHINA 本期高手问答(2018 年 5 月 22 日 — 5 月 28 日)我们请来了强波@paulQuei和大家就关于剖析 Android 新特性方面的问题进行讨论。 强波,江苏南京人,现居住在浙江杭州。就职于阿里巴...

局长 ⋅ 05/22 ⋅ 0

AndroidThings之基础二 设计理念

转载自:https://blog.csdn.net/tangxiaoyin/article/details/75273491 (PS:目前AndroidThings已经走向消费级别,发布正式版本1.0版,开发板推荐树莓派3B+) 前言 2012 年 6 月,由 IoT-GSI(...

qq_28831197 ⋅ 05/09 ⋅ 0

Flutter 中文站上线,我整理了一份 8 小时上手指南!

Hi,大家好,我是承香墨影! 距离 Google 在 2018 世界移动大会上发布 Flutter 的 Beta 版本,Flutter 是 Google 用以帮助开发者在 Android 和 iOS 两个平台,同时开发高质量原生应用的全新移...

承香墨影 ⋅ 04/17 ⋅ 0

答CsdnBlogger问-关于安卓入行和开发问题

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 问1:请问大牛对功能和框架的认识有哪些?(提问者:执笔记忆的空白) 比如对于一个小公司来说,什么样的框架最适用,您经...

liuzxgeek ⋅ 2016/09/21 ⋅ 0

Android MVP框架学习实践

五五六六七七八八 作为一名大三在读的学生,想着自己的大学生活只剩下一年了,有了些许紧迫感,于是就打算找一份实习工作来增加自己的项目实战经验。 想着互联网公司都基本都有现成的项目,实...

reggie1996 ⋅ 05/20 ⋅ 0

云图信安(成都)科技有限公司招聘

  公司介绍   云图信安(成都)科技有限公司是一家以互联网平台运营、WEB应用开发、软件开发、大数据分析、移动互联网通讯技术、云计算、营销推广、技术培训等技术为核心的科技公司。公司...

FreeBuf ⋅ 06/13 ⋅ 0

互联网三线城市春招Android面试笔记

概述: 坐标:福建福州 学历:专科(软件工程专业) 历时:2个月(2018.3.20~2018.5.17) 平台:前程无忧(51job.com)、智联招聘(zhaopin.com) 投递简历:62份(前程49+智联13) 面试:2...

E_Sun伊森 ⋅ 05/18 ⋅ 0

Android P 应用兼容常见错误及建议

从 2018 年 3 月初我们发布 Android P 开发者预览版以来,很多开发者都对当前常见应用在 Android P 上做了一些兼容性测试,我们在这里总结了一些常见的问题,以及它们发生的原因和建议的修改...

谷歌开发者 ⋅ 04/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 35分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 50分钟前 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 今天 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部