Android知识点总结

        总结的意义在于加深自己的印象,同时做好笔记方便复习。本篇文章主要是对android各知识点做个总结,这个周期可能比较长,但是每天总结几个,慢慢就多了。没有先后顺序,想到哪写到哪。。。。

1、relativeLayout和LinearLayout的性能对比:

  • RelativeLayout会对子View做两次measure。   因为RelativeLayout中子View的排列方式是基于彼此的依赖关系,而这个依赖关系可能和布局中View的顺序并不相同,在确定每个子View的位置的时候,就需要先给所有的子View排序一下。
  • RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。    
  • LinearLayout 在有weight时,也会对子View做两次onMeasure 。  如果不使用weight属性,LinearLayout会在当前方向上进行一次measure的过程,如果使用weight属性,LinearLayout会避开设置过weight属性的view做第一次measure,完了再对设置过weight属性的view做第二次measure。由此可见,weight属性对性能是有影响的,而且本身有大坑,请注意避让。
  • 在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。 
    采用RelativeLayout并不会降低层级深度,所以此时在根节点上用LinearLayout是效率最高的。而之所以给开发者默认新建了个RelativeLayout是希望开发者能采用尽量少的View层级来表达布局以实现性能最优,因为复杂的View嵌套对性能的影响会更大一些。
  • 能用两层LinearLayout,尽量用一个RelativeLayout,在时间上此时RelativeLayout耗时更小。另外LinearLayout慎用layout_weight,也将会增加一倍耗时操作。由于使用LinearLayout的layout_weight,大多数时间是不一样的,这会降低测量的速度。这只是一个如何合理使用Layout的案例,必要的时候,你要小心考虑是否用layout weight。总之减少层级结构,才是王道,让onMeasure做延迟加载,用viewStub,include等一些技巧。1、relativeLayout和LinearLayout的性能对比:

2、String、StringBuffer与StringBuilder之间的区别

  • 首先String是字符串常量;也就是不可改变的对象。也是执行速度最慢的。
  • StringBuffer与StringBuilder是字符串变量,执行速度快。最快的是StringBuilder。
  • StringBuilder是非线程安全的,StringBuffer是线程安全的。

具体分析如下:

  1. String s = "abcd";  
  2. s = s+1;  
  3. System.out.print(s);// result : abcd1  

上面说String是字符串常量,是不可改变的对象,但是我们明明就是改变了变量s了,为什么说是不可改变的对象呢?  其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s,用来执行第二段代码,也就是说我们之前创建的变量s并没有变化,所以我们说String类型是不可改变的对象了。由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾,等待系统回收,可想而知这样的执行效率会有多低。

而StringBuffer与StringBuilder就不一样了,他们是字符串常量,是可以改变的对象,每当我们用他们对字符串做操作时,实际上是在对一个对象做操作,这样就不会像String一样创建一些额外的对象了,当然速度就更快了。

总结如下:

  •  如果要操作少量的数据用String
  • 单线程操作字符串缓冲区下操作大量数据用StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据用StringBuffer

3、PopupWindow和Dialog有什么区别? 

  •  PopupWindow在显示之前一定要设置宽高,Dialog无此限制。
  • Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
  • Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。
  • Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
  •  两者最根本的区别在于有没有新建一个window。PopupWindow没有新建,而是将view加到DecorView;Dialog是新建了一个window,相当于走了一边Activity中创建window的流程。

    PopupWindow的相关源码:

    查看mPopupWindow的showAtlocation()方法中的invokePopup()方法:

    Android知识点总结

    从源码可以看出,popupWindow最终是执行了mWindowManager.addView方法,全程没有新建window。

    Dialog相关源码如下:

    Android知识点总结

    很明显,我们看到Dialog执行了window的创建。