某技术大牛的帖子(android项目总结)

时间:2021-03-18 14:25:40

1. 一般性控件需要设置onclick事件才会有点击效果(selector)。

2.  <item android:drawable=”@drawable/btn_ct_green” />要写在selector的最后才会有点击效果。

3. 制作.9格式图片选最小图,否则默认大小撑大控件。
4. 如果将一个对象的属性设置为static,那么就算对象实例被回收了,该属性也存在内存,生命周期为app的生命周期。
5. OOM:普通视图和listvew等大数据量展示视图的图片控制分开来。
6. OOM:listview等列表1秒真释放,把大数据量加载后不用的图片释放。
7. OOM:大图片使用前压缩。
8. OOM:减少大图。美工将全部规则图最小化,制作.9格式,以最小程度占用内存。
9. OOM:背景图、大图谨慎使用,不规则大图显式释放。
10. 提前得知大小可使用,view.measure(-1, -1);但是view必须得有父view。
11. listview列表呈现多种样式,getViewTypeCount()方法返回全部样式的总数,getItemViewType(int pos)返回的值必须小于getViewTypeCount(),否则报错。

12. 公共类、接口、基类设计要职责清晰易理解,最大量减少别人使用时的难度。

13. OOM:webview 内存溢出(OOM),重启一个新进程。
并且设置:需要在onPause时停止Timer,解决由于Timer在,导致WebCoreThread一直在,WebviewCache.db被锁定, 图文详情无法进入的问题webview.pauseTimers();
当Activity返回onResume时WebView.enablePlatformNotifications();webview .resumeTimers();
14. 触控范围要作为一个规范来控制到开发的每一步中,有src属性的可以设置padding,没有的为了不失真,套一个layout,最小宽度48dp(9mm)。
15. 请求带有时间戳请注意,yy-MM-dd hh:mm:ss是12小时制格式。yy-MM-dd HH:mm:ss是24小时制格式。差别巨大。
16. 基础数据类型的封装类型是有预装缓存的,JVM给Byte缓存了-128~127的对象,Integer缓存了-128~127。所以Integer i =k,Integer j =k,,k = 127,i == j为true,k=128则为false。
17. 逻辑条件加紧要慎重,放宽松更要慎重;放宽后考虑是否更引发副作用问题,聚划算将id=()、itemId=(),i()都抓下拉起详情,结果频繁无辜拉起。收紧后考虑是否会引起扩展问题
18. 最后一刻加上的代码要严格的测试,很多时候就是最后‘以为’加上了‘无关紧要’的东西而导致崩溃掉。
19. Math.abs()取到的不一定是正数,Integer.minValue就是负值。
20. 多线程请使用并发容器放置变量,不轻易认为机会少不会冲突,并发量一大什么都有可能。ThreadPool.shutdownNow()之后只是清除等待队列,然后等待活动线程执行完。
21. 强转类型之前先先确定对象不为空。
22. android2.3以下版本listView.setDividerHeight()函数调用后,notifyDataSetChanged()便不能记住位置。可使用setSelection记住位置。
23. finish和startActivity位置很重要. 由A跳转向SingleTask的Activity B,A.finish的位置在startActivityB之前,退出B按home回到(home键退出或back键finishB)应用界面仍然是B,无论B是否是action.MAIN,overridePendingTransition需要在finish或者startActivity之后才有效。
24. 区域事件拦截:比如只要ViewA获取点击事件而组织其父控件和其他子控件触发事件,可重写activity的dispatchTouchEvent()函数,调用ViewA.getHitRect(rect),初始化一个Rect,判断event的getX和getY如果在rec之内,拦截ACTION_DOWN返回true,其余ACTION调用ViewA. dispatchTouchEvent() 即可拦截事件。
25. 一次有效触摸,当ACTION_DOWN返回ture时,其他事件也不会在得到响应。当event在rect之外时,可以通过event.setAction(MotionEvent.ACTION_DOWN);activity.onTouchEvent(event);来重新触发事件。
26. WebView:缓存与不缓存,很关键。尤其在活动、计时、含session界面。
27. WebView:当webview占用大量内存时,可以将WebView全部启动在另一个进程中。
28. WebView:当多个重定向干扰或不能后退到上一页时,不使用webview.goBack(),自己用栈Stack维护Url,其关键在于区分是否是重定向,目前采用java调用js获取、分析网页内容判断是否重定向,如果不是再将url放入stack,反之不入栈。
29. 无线电波状态机:应用运行在前台考虑避免延迟阻塞,运行在后台关注电量浪费。优化网络连接:预取数据,批量传输与连接(包含携带、顺带其他数据),减少连接次数(规避高频心跳)。
30. 当listview含有Header时,在onItemClick事件中请这样获取ItemObject:Object obj = parent.getAdapter().getItem(position); 先判空,再强转为需要的对象。
31. WebView: 注意对下载文件的支持;shouldOverrideUrlLoading返回false,会自动加载该页,返回true不会加载网页,需要自己处理(之前返回true,调用WebView.load(url)结果造成重定向网页不能回退的问题,自己花了很大代价才解决,直接返回false会自动加载)。
32. 使用一个函数,尤其别人写的函数,不管怎么诚恳的承诺参数不会为null,请尽量做非空判断。除以一个变量之前,先确定其不为0.
33. 如果程序自自动,或者后台耗流量,首先检测manifest中静态注册的广播,它会拉起程序。
34. findbugs结合使用ADT(16以后)自带的lint检测程序中的问题,lint可以检测出未使用的图片和更具android特性的问题。
35. View onMeasure之后,width不一定有值,如果设置了LayoutParagrams那么view.getLayoutParams().width将有设定值。
36. Gallery特性改善:一次触摸只切换一张图片:复写onFlying直接返回true;使触摸更加灵敏:复写onScroll 调用super.onScroll(e1, e2, distanceX * 1.5f, distanceY),使distanceX 变大就更加灵敏。
37. Gallery视觉优化:setStaticTransformationsEnabled(true)之后,getChildStaticTransformation方法生效,默认方法会使图片alpha值改变变而视觉不清,复写可以利用Camera产生xyz和角度的改变,从而优化视觉体验,比如打造3D画廊。
38. 可共用的对象属性用static来保持一份节省资源,每个实例或者对象单独享用的属性切记不要static。
39. 改变一个类的私有属性:
Field field = ViewGroup.class.getDeclaredField(“hsl”);
field.setAccessible(true); field.set(listView, 0);
40.  Which client is best?

Apache HTTP client has fewer bugs on Eclair and Froyo. It is the best choice for these releases.

For Gingerbread and better, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery. New applications should use HttpURLConnection; it is where we will be spending our energy going forward.

http://www.vmatianyu.cn/poly-effective-client-1-issues-lessons.html