首先说一位大神Lucasr,http://lucasr.org/about/ 。
前FireFox工程师,现在已经跳到facebook。
我的这篇博客,精华部分是由他的熏陶。
1.
用RelativeLayout要好于LinearLayout,(weight的计算会大大消耗性能)
用GridLayout要好于RelativeLayout,(优势在于减少层级)
用FrameLayout好于GridLayout,(减少布局计算时间)
用merge要好于FrameLayout。()
2.
开发的时候要尽量减少View层级,第一降低内存消耗,第二,减少图层绘制消耗的时间。
3.
ViewStub,可以延迟部分view的绘制时间,减少首次界面绘制消耗的时间,ViewStub使用的话官方推荐Inflate(),会返回一个view,so你懂的我就不多说了,
但是inflate()方法如果重复调用就会带来崩溃,一般可以采用setVisibility(View.VISIBLE),这样可以避免inflate重复调用崩溃的问题。两个方法各有优缺点,根据需要各取所需吧。
4.
Include是一个非常好的东西,减少view标签,增加重用,用法很简单,这里不做赘述了。
5.merge标签,临时的一个套件,需要将内部的东西转移到一个Layout里面。
另外有两点需要特别注意:
<merge />只可以作为xml layout的根节点。
当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。
6.
Space是一个亮点,他不会发生绘制,用于空出空间的view,有些必须要用View来空出距离的地方,可以用这个Sapce进行替换,这样就可以减少view。
7.
ListView,GridView 的每个item的布局 xml 里面要尽量优化layout层级。最外层尽量用FrameLayout。
内层也要尽量不要使用LinearLayout。PS:如果是Activity的布局界面的话,无所谓了,绘制缓慢不会很明显,但是,在滚动的界面中,层级一旦多了,就会导致滚动卡顿。
8.
ListView滚动掉帧现象终极解决方案:
ListView卡顿问题,在android平台上简直是常见! 由于android屏幕刷新频率是60HZ,那么16ms就是刷新间隔,一旦超过16ms就会明显被看出来。那些静止的页面又不需要刷新,所以即使卡顿也看不出来。滚动边绘制多层view确实需要多线程,但是android的UI线程是个单线程的,其他县城又不允许操作view,所以滚动卡顿是很难的现象。
那么,这个掉帧现象出路在哪里?
最好的解决方案有两种:
(a). flat custom view 将多个view的层级合在一起。要自己去写canvas,代码写起来颇为复杂,但是最终的效果蛮好的。微信的联系人列表页就是用这个方法。每个item的层级为0。只有一个view。
(b). asyncview 也就是这篇文章顶部的的大神Lucasr,所首创的。实现起来颇为复杂,我下载了他的git代码,发现特么的,代码还不全,根本跑不起来。我又去找另外他的几个git的项目,合在一起终于跑起来了。
结果,发现项目太复杂了,没写注释,另外这货竟然也是用MVP模式,需要有很大的耐心才能看完。
今天写到这里。后期持续更新。