Android开发问题总结 --- 2014/07/20

上一周算是自己第一次开发商业Android产品的过程中,遇到了不少小细节点,学到了很多东西,很久没有这种学习新知识的感觉了,也已经很久没有知识能刺激我写博客了。感觉很庆幸,自己之前虽然没有怎么写Android代码,不过积累了很多知识,类似一些Android开发中比较高级一些的内容,自己竟然也总结明白了一些,这周在多看上面买了一本Android开发高手进阶,翻开看了一下,发现里面很多的知识点我竟然都已经搜集总结过了,这个让我有些失望,不过好好读读,算是吸收一些经验。对于目前的自己来说,我还是觉得要想进步,只能不停去读源代码,这点恰恰是我最懒的地方。不过我想终究会克服自己这个问题的。


===========================================================================

1. 在Android 新版本UI改版的过程中,我遇到一个非常复杂的页面,简直让我束手无策,之前的实现里面有太多的全局变量,UI也没有分层次,都是使用布局文件累积出来的,修改的时候简直无从下手。想了一下,决定按自己的思路进行重写,废弃之前的UI。我决定使用Fragment重写一个Listview的headerview,这个是整个页面中最复杂的一部分。遇到的第一个问题是如何使用fragment作为headerview,其实还算简单,使用一个布局文件,其中包含一个fragment,平时都是使用代码去生成fragment,都忽略了fragment还有这么有趣的用法:http://stackoverflow.com/questions/12630567/add-a-fragment-as-listview-header,这里面有个问题需要注意,就是在获取LayoutInflater的时候,必须使用FragmentActivity的context才行,不然就无法解析fragment标签。


2. 第二个问题,在listview的实现中,我决定使用组合View来简化代码结构,不是使用一堆的ViewHolder来做,iOS开发做习惯之后,这种方式让我很不适应,尤其是对于较为复杂的ListItem,简直让人有些郁闷。Adapter的代码也会变得有些混乱,代码也无法分层。之前Android weekly上面看到过一篇讲自定义View的文章(我翻译的地址http://blog.csdn.net/colorapp/article/details/27327629),简单的组合View的使用让我眼前一亮,这个成本不高,任何做Android的开发者都能很快使用起来,我觉得这个更像是一种设计思路的体现,面向对象的封装,但是很奇怪我看了很多代码,都是不停强调使用ViewHolder进行优化,而不是进行面向对象式的封装。我个人实践了一下,强烈推荐这种实现方式。其实就算是自己需要重写onMeasure和onLayout方法,这个成本也不算太高,对一些比较重要但是结构较为复杂的listview页面,采取这种方式我觉得是非常恰当的。这里实践过程中,我感觉较有意思的问题是关于inflater的inflate方法的,关于最后一个参数的使用,参考这篇我转载的文章:http://blog.csdn.net/colorapp/article/details/36629735


3. 在实现listview的过程中,我遇到一个很有意思的问题,listview的不同postion的item的样式是不一样的,发现之前我们内部的实现是就一种样式,在使用的时候会把不需要的布局给隐藏掉,这种实现我个人觉得大大增加了维护的难度,需要写一堆无用的代码去做View的可见的调用,非常难读。找了一下,发现其实listview可以有不同的样式的,在BaseAdapter中实现getViewTypeCount和getItemViewType方法就行,这两个方法我自己觉得太大有用途了(参考:http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row,http://stackoverflow.com/questions/9664100/different-row-layouts-in-listview),结合组合View一起使用,就可以大大简化Adapter中的代码结构。这样写起来UI,再结合布局文件和Fragment,比iOS要更加便利,并非传说中的难以适配。


4. 经常遇到一个UI让我很困惑,一个背景图片,上面有一个小图片加一行文字。都告诉我使用LinearLayout实现,但是我觉得LinearLayout布局的时候非常耗费资源,而且使用的时候也无形中要麻烦一些。于是我找了一下,中文大部分都说使用LinearLayout,后来在stackoverflow上面找到一篇文章:http://stackoverflow.com/questions/1532876/android-combining-text-image-on-a-button-or-imagebutton,这个让我再次有Android SDK有些地方做的的确比iOS要方便,这个效果其实iOS中的Button除了自己添加View之外,也可以直接使用API实现,不过自己去设置inset会非常麻烦,不如Android SDK这么简单直白。


5. 布局文件中添加自定义View中失效的问题,在添加自定义View的时候,设置一些自定义属性,如"app:imagesrc",总会莫名其妙出现红色的警告,总会提示"app"有问题,但是别地方也是使用"app"就能设置自定义属性,这让我很纳闷,最后确定这个xml的namespace问题,添加一行"xmlns:app="http://schemas.android.com/apk/res-auto"就解决这个问题。或者在自定义declare-styleable中设置attr的时候,直接设置为"android:imagesrc",这样就把属性设置在android 的命名空间内,设置属性的时候使用"android:imagesrc"即可,http://stackoverflow.com/questions/2695646/declaring-a-custom-android-ui-element-using-xml 


6. ListView无法设置margin的问题,在自定义listview的item的时候,发现设置的margin竟然是无效的,网上找了一下,发现listview中item的parent是不支持设置margin的,http://www.cnblogs.com/xitang/p/3677528.html, http://stackoverflow.com/questions/16278159/why-linearlayouts-margin-is-being-ignored-if-used-as-listview-row-view


===========================================================================

做了两周Android开发,感触还是挺多的,还是那句话,任何一门技术想要做好,都需要很久积累和实践才行。每个平台都有自身的API,但是无论是Android还是iOS还是其他UI开发,都有一个优势,那就是使用eventloop来避免多线程竞争的问题,这也就是说我们没有必要像后台开发人员那样频繁处理这种问题。个人觉得,Android有一个无法避免的缺陷,就是底层对线程池的支持不足,iOS中GCD以及NSURLConnection底层都是线程池机制实现的,这样肯定会大大减少各种开销,Android中则是对thread到了一种滥用的底部,幸亏Volley这样的开源库可以研究,看它内部的线程池是如何实现的,值得参考,不过无法避免SDK层面的支持不足的问题。

你可能感兴趣的:(Android开发经验,Andriod开发总结)