Android 第一波

1. Devik进程,Linux进程,线程的区别

说一说对 SP 频繁操作有什么后果? SP 能存储多少数据?

      SP 的底层其实是由xml文件来实现的,操作 SP 的过程其实就是xml的序列化和反序列化,序列化是将数据写入 xml 文件的过程中
       xml 文件是存储在磁盘中的,考虑到 I/O 的读取,最好不要对 SP 进行频繁的操作.
      因为dvm的堆内存是有限的,所以 xml 文件最好不要太大,具体多大都没有要求,但是我们都知道DVM堆内存也就 16M ,数据大小肯定不能超过这个数字.
     其实 SP 主要是存储用户配置和偏好的,不必要去存储大量数据.

2. 内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?

①内存溢出

定义: 申请的内存空间时没有足够的空间供其使用,内存空间不足
举例:

  1. 内存数据过多,从数据库一次性取出过多数据
  2. 对象内存过大,如大量的视频音频图片的操作也会导致内存溢出
②内存泄漏

定义: 申请完内存空间后没有及时释放掉资源,白白占用资源
举例:

  1. 使用static 关键字修饰变量,比如修饰context时,他的生命周期会很长,activity销毁时,由于他持有activity的引用所以不能被回收.解决办法是,统一使用application的context
  2. 不能及时关闭资源.如及时注销广播,关闭文件流,关闭数据库的游标cursoer,当使用动画时注意停止动画播放等等
  3. 非静态内部类和匿名内部类Handler Thread Runnable 等持有外部activity的引用,当关闭activity时线程未关闭导致的内部泄漏.
    非静态内部类会持有activity的隐式引用,若内部类生命周期长于activity,会导致activity实例无法回收,造成内存泄漏
    如果要使用内部类,需要使用static来进行修饰,在内部类中使用弱引用引使用外部资源,对handler,thread等使用弱引用,最后是有removeCallbacksAndMessages移除.
③内存抖动

频繁的进行内存释放和回收
Android 的虚拟机是基于寄存器的Dalvik,他的最大堆大小是16M,有的机器是24M,所能使用的内存空间是有限的,内存占用超过就会出现 OOM 异常
产生原因

  • 对象内存过大,比如bitmap、xml文件,造成内存超出限制
  • 使用过后的资源不能及时释放,造成内存泄漏
  • static 关键字的使用,因为使用 static 修饰的变量,他的生命周期很长
    -----------避免使用static 成员变量引用资源耗费过多的实例
    ------------尽量使用applicayion 的 Context
    -----------使用软引用代替强引用
  • 线程导致内存泄漏
    主要是因为线程生命周期的不可控,例如,在开启线程时进行横竖屏的切换操作,一般情况下的横竖屏切换会重新创建Activity,而老的Activity是会被销毁的,但是实际上并不是这样,因为在线程中保存了 Activity 的引用,当Run函数没有执行完的时候,线程是不会被销毁的,因此就会出现了内存泄漏的问题。如果使用 AsyncTask 也不可以,因为他的内部实现时使用线程池,threadPoolExcutor,这个类对thread对象的生命周期是不可控的。

3. Activity是如何生成一个view的?

Activity 是一个工人,它来控制 Window ;Window 是一面显示屏,用来显示信息;
View 都是层层重叠在一起(通过 infalte() 和 addView())放到 Window 显示屏上。
LayoutInfalter 就是用来生成View的 一个工具,XML 布局文件就是用来生成 View 的原料

代码具体的执行流程:

setContentView(R.layout.main)其实就是下面内容。
getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))
运行程序后:
Activity 会调用 PhoneWindow 的 setContentView() 来生成一个 Window,而此时的 setContentView 就是那个最底层的 View。
然后通过 LayoutInflater.infalte() 方法加载布局生成View对象并通过 addView()方法添加到 Window 上,(一层一层的叠加到 Window 上)
Activity 其实不是显示视图,View 才是真正的显示视图。
一个 Activity 构造的时候只能初始化一个 Window(PhoneWindow)
另外这个 PhoneWindow 有一个”ViewRoot”,这个”ViewRoot”是一个 View 或 ViewGroup,是最初始的根视图
然后通过 addView 方法将 View 一个个层叠到 ViewRoot 上, 这些层叠的 View 最终放在 Window 这个载体上面

(3题答案是参考大神:http://blog.csdn.net/sada09/article/details/8644901)

4. Android 程序运行时权限与文件系统权限的区别?

6. HTTPS 和 HTTP 区别

① https协议需要到ca申请证书,一般免费证书很少,需要交费。
② http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
③ http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
④ http的连接很简单,是无状态的
⑤ HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

7. 简述对 AIDL 的理解

① AIDL 是 Android Interface Definition Language 的英文缩写,Android 接口定义语言
② AIDL 可以发布及调用远程服务,实现跨进程通信
③ 将服务的 AIDL 放到 src 目录下会在 gen 目录下生成相应的接口类

8. ForceClos e出现原因,如何避免

9. 如何解决 android 方法数量不超过 65535

从sdk\extras\Android\support\multidex\library\libs 目录将Android-support-multidex.jar导入工程中
如果你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类,
如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法

10. AsyncTask 使用在哪些场景?它的缺陷是什么?如何解决?

11. View 与 ViewGroup的区别?

android view和 ViewGroup,在架构上看似乎ViewGroup之上,
View需要继承ViewGroup,但实际上不是这样的。
View是基类,ViewGroup是他的子类,这就证明了View代表了用户界面的组件的块可绘制的中间区域块,每个View在屏幕上占据了一个长方形区域,
在这个区域内,这个View对象负责图形绘制和事件的处理,View是小控件widget和ViewGroup的父类,ViewGroup又是Layout 的基类

12 post请求与get请求的区别

1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来
2.使用Get请求发送数据量小,Post请求发送数据量大
1.get请求需注意缓存问题,post请求不需担心这个问题
2.post请求必须设置Content-Type值为application/x-form-www-urlencoded
3.发送请求时,因为get请求的参数都在url里,所以send函数发送的参数为null,而post请求在使用send方法时,却需赋予其参数
在客户端使用get请求时,服务器端使用Request.QueryString来获取参数,而客户端使用post请求时,服务器端使用Request.Form来获取参数.
关于服务器端获取数据,我们还可以使用一个通用的获取参数的方式即Request["username"],但是此方法存在一个问题,我们随后来讲.
下面,我们使用HttpWatch来看下,当使用get和post方式发送请求时,客户端究竟发送了什么,收到了什么.
对于get请求和post请求中的时间差,请不要在意,因为是在不同时间按下的get按钮和post按钮.

posted @ 2017-04-25 23:19  EugeniaGao  阅读(204)  评论(0编辑  收藏  举报