2017Android面试总结

来源:互联网 发布:软件售后考核制度 编辑:程序博客网 时间:2024/06/08 13:33
Universal-Image-Loader流程
1,内存缓存:map对象缓存,key是url地址,value是bitmap对象
2,本地文件缓存:htpp中下载的图片保存在sd中
3,网络加载
Picasso
在Adapter中回收和取消当前的下载功能
转换图片以适应布局大小并减少内存占用


自定义view
如果有布局需要发生改变,需要调用requestlayout方法,如果只是刷新动画,则只需要调用invalidate方法
Touch事件传递机制:
分派事件
dispatchTouchEvent
拦截事件
onInterceptTouchEvent
处理事件
onTouchEvent


view具有分派、处理事件的能力
viewGroup具有分派、拦截、处理事件的能力
viewGroup相当于领导,会把任务向下分派,一旦下面的人把事情做不好,就不把后续的任务交给下面的人来做,领导也有权利
拦截事件,直接自己去做


ThreadLocal是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,而这段数据是不会与其他线程共享的。


java反射机制:对于任意一个类,都可以查看类的属性和方法,对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息及动态调用对象方法的功能称为。。。
EventBus原狸:
register会把当前类中匹配的方法,存入一个map,而post会根据实参去map查找进行反射调用
map存储,键就是参数的class类型 值是事件集合,
post方法:根据postingThreadState获取当前线程的postingState,取得当前线程的事件队列,将事件添加到
当前的事件队列中等待分发,当前线程所有分发的事件都保存在eventQueue事件队列中以及订阅者订阅事件等信息


Window相当于一个容器,里面“盛放”着很多view,这些view是以树状结构组织起来的。
Activty像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示识图)
LayoutInflater像剪刀,Xml配置像窗花图纸
1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。
2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。
3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等
4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。


Unable to add window 
网络请求拿到数据后调用Dialog显示,发生这个bug
如果我们等的时间太长,我们就没耐心再等下去了,而是选择关掉然后重新打开,或者直接关掉不管了,但是异步请求的线程可能刚完成工作,正要执行Dialog的show方法,
但此时activity已经被关掉了,Dialog要show的父窗口已经不存在了,因此出现了上面log所描述的错误异常


解决办法:
就是在显示Dialog之前检测一下所在Activity是不是正处在销毁阶段:
if(!((Activity) context).isFinishing()) {  
    //show dialog  
}  


OkHttp原理分析:




IPC机制
Android 最有特色的进程间通信Binder,Android还支持Socket,通过Socket也可以实现任意两个终端之间的通信,当然同一个设备上的
两个进程通过Socket通信自然也是可以的
只有面对多进程这种场景下,才需要考虑进程间通信
在Android中使用多进程只有一种方法,那就是四大组件(Activity,Service,Receiver,ContetnProvider)在AndroidMenifest中指定
android:process属性
进程名以:开头的 进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以:开头的进程属于全局进程
其他应用通过ShareUID方式可以和它泡在同一个进程中
使用多进程遇到的问题:新建一个类定义一个静态成员变量,设置值为1,然后在MainActivity
中把这个变量重新赋值为2,打印出这个静态变量的值后再启动SecondActivity(新的进程),在SecondActivity中发现这个变量的值还是1
原因:SecondActivity运行在一个单独的进程中,我们知道Android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机
不同的虚拟机在内存分配上有不同的地址空间,这就导致不同的虚拟机中访问同一个类的对象会产生多份副本。


所有运行在不同进程中的四大组件,只要它们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响
一般来说,使用多进程会造成如下几方面的问题:
1,静态成员和单例模式完全失效
2,线程同步机制完全失效
3,SharedPreferences的可靠性下降
4,Application会多次创建
实现跨进程通信的方式:通过Intent船体数据,共享文件和SharedPreferences,基于Binder的Messenger和AIDL以及Socket等


IPC主要包含三个方面的内容:Serializable接口,Parcelable接口以及Binder
从Android Framework角度来说,Binder是ServiceManager连接各种Manager(ActivityManager,WindowManager等等)和相应ManagerService的桥梁
从Android应用层来说,Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的Binder对象,通过这个
Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务
原创粉丝点击