1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.(确实:很多程序员最喜欢的就是逻辑功能的实现,UI属于花花绿绿的东西,好像不值得程序员花大量时间去思考。但他没什么叫UI,软件都是拿来给用户使用的,没有一个好的吸引人的界面,就没有大量的多户青睐,也就不是一个成功的应用。附:一个Demo掌握Android所有控件http://115.com/file/aq51g82i#,service Demo http://115.com/file/bhru7vqo#)
2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来.(这样写起程序来思路清晰,不容易乱,对要写的应用有一个整体感觉)
3.要有自己的知识库,可以是一个工具类,把写过的,看过的好的代码放进去,也可以是一个笔记本软件.因为只有放在知识库里的东西,才是你最重要的财富.(好记性不如烂笔头,大家都应该知道代码复用的好处,这里不仅是代码的复用,也是思维的复用,时间的复用,通过这种积累,就会感觉做一个软件所花的时间越来越短)
4.如果你想做自由职业者,你需要学英语,因为软件在国外的盈利比国内多很多.如果你想进大公司,好公司,你需要学英语.中文的android文章太少了,你查查百度,到处都是copy来copy去的hellword,所以,你需要学英语.如果你想出国,你需要学英语.(Java DOC还有个中文版本的,一碰到这个Android全是英文的,像我这种英语特别差的就感到太吃力了,还好有一部分是一些同僚、前辈翻译过来的,很感谢他们,但是可能精力有限,大部分的内容都没有中文翻译。所以学好英文对学好Android开发的帮助是明显的)
5.Http协议要研究透彻.http的信息头有什么信息,分别代表什么,信息体有什么信息,代表什么,都要搞的明明白白.scoket也是一样.(特别在做一些网络开发的时候,网络协议或很多网络应用(JavaMail)是有结构的,我最近在写的邮件客户端,在解析邮件内容时就明显感觉到了,只有了解了邮件内容每部分是如何组成的,才能将它用程序完全解析出来。)
6.在eclipse里的layout文件都有graphical Layout.通过这个好好的把UI调整好.(哎,没在里面调过,我在代码中调了以后是到这里去看效果的)
7.Android里的junit每次运行都会打包新的apk到设备上跑.效率非常慢.如果是跟android无关的测试,最好自己建立一个单纯的java项目做测试.(确实,特别是模拟器,每次运行都要反应很长时间,真机也要一定的反应时间。我最近做的邮件内容解析显示的时候就深感这点不便,于是我就把代码拷出来,直接用Java测,知道全部的内容达到我要显示的内容即可,一点击run-JavaApplication就立马看见效果了,轻松愉悦!)
8.不要觉得自己提的薪水太高,物以稀为贵明白吗?不管你的期望薪资多少,都有可能实现,这只是时间问题.(还没有参加工作,还没有体会吧。但路是自己走出来,不是富二代,不是官二代,就不要想鸡窝里一下就飞个金凤凰,踏踏实实才是上策!)
9.如果一家小公司通过猎头找到你,即使公司在小,也比外面那些40,50人的公司还要好.不要觉得公司不行,担心会倒闭.放心吧,至少活1年是没问题的.(没有工作经验的我也不能多说,但是我觉得现在Android的开发目前在国内都做一个小的项目,没有向JavaEE那样的企业级开发,小公司很锻炼人,而且一在一年之内好好学习锻炼,一年后即使公司倒闭,还害怕找不到饭碗吗!)
10.不要把自己绑在android上,有空也研究下IOS(最近小弟就准备研究ios,刚买了6本书...).(IOS和android都是当前最火的两个手机操作系统,IT行业大家是知道的,更新换代用一句话说就是“这也忒他妈快了”;而且这两个是如此的相似,学起来共通的地方很多,不是很困难。学JavaEE的不是一般也要学习ASP.net吗,公司的需要你也只能满足)
11.移动互联网最少还有10年的快速增长.android最少还有两年的快速增长.走android这条路是不会错的.(个人观点,入了这一样,就好好干吧,紧跟时代发展)
12.有空多学点开放平台的SDK.比如新浪微博,腾讯微博,淘宝平台,支付宝移动支付平台,快钱移动支付平台等等..这些都是不愁没市场的.(多学一点总是有好处的)
13.即使技术再差,也要发布一个应用到market上去.因为这样你才了解做一个应用的业务逻辑.(再先进的武器只有拿到战场上去实验,才知道武器的好坏,找准武器的不足。自己的东西只有拿给用户用过以后才知道如何改进,有用户用你编写的软件以后也可以增长你个人编程的信心。等咱这个邮件客户端写好了也挂上去,呵呵)
14.每个月拿到薪水省500-1000元出来.这些钱投在买学习资料,去培训班上课...在培训班,花再多的钱也是值得的.(不知道,还没找钱呢,IT行业日新月异,是需要话很多时间去不多学习新技术的,当然,这必然也要花不少的钱)
15.你真正的价值在项目经验和对底层的认识上.不要忽略基础知识.(对的,我感觉是我们这种刚做软件的,指出这是特别重要,没有基础知识,只是一味的套用别人的代码,对自己的长远发展没有好处)
16.如果有空把Android的源代码看一下.底层的东西很枯燥,但这些很值得学.(有时间可以看看,不过不建议一看是就去看源码,有一定的开发经验以后可以去接触,他能让你在编写Android应用的时候随心所欲,编写随心所欲的代码不就是程序员追求的吗!!)
17..程序员其实是艺术家.代码重构和设计模式,是非常非常重要的东西,必须要学 (就是上一条谈到的随心所欲,程序员就是想让编写程序编程一种享受)
18.不要去维护一个项目,要去做一个项目.(深有体会,大三暑假去一公司实习,维护一个用SSH结构写的项目,看了两个月,确实,叫我到里面去找一个功能,我可以很快就找到了,叫我自己去写,去陪SSH中的配置文件,我一点都不会。后来回学校自己写了一个SSH框架的图书馆管理系统,将整个流程走了一遍,那收获就不一样了。做程序,亲自动手这是必须的,“做了才会”这是学习程序永远不变的真理)
19.一开始不要轻易去大公司,虽然大公司是可以让你呆一辈子的.但你的起点低,以后成就也低.(虽然没有去过公司,但这一点我有点自己的看法,金子在哪里都是亮的,在一个更好的环境中,他会更亮。不过金子确实只是少部分)
20:每天早上提前20分钟上班,5分钟把今天的工作计划写好.15分钟用来看各大It论坛的新闻.(做软件当然做计划是很关键的,达到一个项目甚至一辈子,小到一天,一个功能,没有计划的去工作与写程序,你就会发现你做事越来越慢,很多事情可能会反复去做多次,费时费力。看IT新闻是必然的,IT也还是那句话“忒他妈快了”)
21:如果以前没做过java,那就把SSH看下,自己搭建一个小服务器.这是为了接私活用.(还好接触过,能看懂。Android应用很多也要有服务器端,SSH是一个搭建服务器端很好的框架,而且向作者说的还可以作别的事。)
22:PS一定要学,接私活用.(PS:不学的生孩子没屁眼,怎么接我真的不知道,我只知道可以到网上接一些活)
23:多下载市面上好的应用,每天都用,只有这样你才能了解市场.现在所有的APK都可以反编译,看源代码麻烦,但看layout和图片很容易,所以....你懂的.(要想有更多的消费者,首先就要去了解消费者,这就要把自己当消费者,切身的去感受一下。第一条说的UI困难,反编译得到layout和图片一条很好的捷径,我做的邮件就参考了一下语盒和网易掌上邮)
24.要有羞耻心.(短短五个字,却打动着每个程序员,大家自己去体会)
25.老板仅仅要求你把东西做完,需求完成.但你必须对自己要更严格一点.写一段代码,从网上复制一份代码,并不是可以用就行了,你还必须明白他的原理,为什么这样就可以?这才是对你最有用的地方,这也是你今后薪资增长的保证.(多对自己问几个为什么,这一点我吃过亏。寒假会重庆应聘,碰到一培训机构开发部招人,培训机构大家知道,那里面的人对基础知识忒他妈熟了,连问我几个为什么,我就牙口无言了。最后给我下的诊断书:你会做,但是不知道为什么这么做!网上用了别人的代码了,完成应用功能了,还要把他变成自己的,每次连接JDBC都去网上拷代码,关键时刻叫你写你还是写不出来,要是遇到面试,还有人要你 吗?)
26.要懂得舍得.移动领域发展太快,必要时必须要用钱换时间.不然你会远远落后别人(我之前花了4000大洋去培训班学IOS三天).(作者好像第14条说过了,这里说语句,不管是做软件,整个社会都是这样:大家都像丛林里的鸟兽,有强有弱,重要的是想着怎么去生存,也就是“丛林法则”)
27.要明白自己想要什么,什么才能最大性价比提高你的能力.对我来说,能让我提高最大的,就是Android和IOS同时会,并且自己可以做架构设计。(做什么,为什么做,怎么去做,做)
做任何事就要学会总结,特别是做技术,只有不断总结,不断积累,才能达到顶峰!
不要仰望山顶,每一个难题就是你通向顶峰的每一个台阶!
原文转自:http://www.eoeandroid.com/thread-159518-1-1.html
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),不可放过。