㈠ android中的线程和线程池
一、除了Thread外,扮演线程角色的还有:AsyncTask和IntentService,同时HandlerThread也扮演特殊的线程。
IntentService:内部采用HandlerThread来执行,像一个后台线程,同时是一个服务,不容易被系统杀死。
二、HandlerThread的run方法是一个无限循环
三、IntentService中任务是排队执行的
四、AsyncTask
1、Android1.6之前串悄段桐行执行任务,1.6时候采用线程池里的并行,Android3.0开始又开始串行(为了避免并发错误),单任可以并行。
2、AsyncTask必须在UI线程调用(不过这个不是绝对的,和版本有关燃腔系,API 16之前,API 16到 22, API 22以后) 参考一
原因:内部有静态Handler,采用UI线程的Looper来处理消息,这就是为什么AsyncTask必须在UI线程调用,因为子线程默认没有Looper无法创建下面的Handler,程序会直接Crash
3、AsyncTask中有两个线程池和一个Handler,一个线程池用启坦于任务排队,一个线程池用于真正的执行任务,InternalHandler用于将
执行环境从线程池切换到主线程
AsyncTask串行与并行
五、线程池
线程池中多余的线程是如何回收的
㈡ 有哪些 Android 的开源界面库
比较火爆的Android开源库有以下:
1、volley
主要有以下模块:
(1) JSON,图像等的异步下载;
(2) 网络请求的排序(scheling)
(3) 网络请求的优先级处理
(4) 缓存
(5) 多级别取消请求
(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)2、android-async-http
主要有以下模块:
(1) 在匿名回调中处理请求结果
(2) 在UI线程外进行
(3) 文件断点上传
(4) 智能重试
(5) 默认gzip压缩
(6) 支持解析成Json格式
(7) 可将Cookies持久化到SharedPreferences 3、Afinal框架
主要有四大模块:
(1) 数据库模块:android中的
,使用了线程池对sqlite进行操作。
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。
(3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。
(4) 图片缓存模块:通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。4、xUtils框架
主要有四大模块:
(1) 数据库模块:android中的
,一行代码就可以进行增删改查;
(2) 注解模块:android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
(3) 网络模块:支持同步,异步方式的请求;
(4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;5、ThinkAndroid主要有以下模块:(1) MVC模块:实现视图与模型的分离。
(2) ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
(3) 数据库模块:android中的
,使用了线程池对sqlite进行操作。
(4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
(5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
(6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
(7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
(8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
(9) 下载器模块:可以简单的实现
、后台下载、
、对下载进行控制、如开始、暂停、删除等等。
(10) 网络状态检测模块:当网络状态改变时,对其进行检6、LoonAndroid 主要有以下模块:
(1) 自动注入框架(只需要继承框架内的application既可)
(2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)
(3) 网络请求模块(继承了基本上现在所有的
)
(4) eventbus(集成一个开源的框架)
(5) 验证框架(集成开源框架)
(6) json解析(支持解析成集合或者对象)
(7) 数据库(不知道是哪位写的 忘记了)
(8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)
(9) 自动更新模块
(10) 一系列工具类
㈢ Framework应用框架为什么重要呢
对于绝大多数 Android 开发工程师来说,掌握Android Framework 一直是一个不光要熟练而且必须要精通的技能。Framework这个应用框架是Android开发中最基础,但同时也是最重要的。Framework包含了Android IPC Binder机制、Handler消息机制、Dalvik VM进程系统、AMS、WMS和Package Manager Service等等。而这些类别里又包含很多小类,有许多的分支,每一个小类里还有很多小细节,这些都是Android开发工程师必须熟练掌握和精通的技能。
如果做成一个框架图的话,就是下面这样的:这只是一个简单的框架图,其实还有很多分支
很多大厂公司在面试的时候都会有很多的技术面试题,这是考察程序员必不可少的题目。
比方说:
1.Android中多进程通信的方式有哪些?
2.进程通信你用过哪些?原理是什么?(字节跳动、小米)
3.描述下Binder机制原理?(东方头条)
4.Binder线程池的工作过程是什么样?(东方头条)
5.Handler怎么进行线程通信,原理是什么?(东方头条)
6.Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)
7.handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)
8.handler的Callback和handlemessage都存在,但callback返回true handleMessage还会执行么?(字节跳动、小米)
9.Handler的sendMessage和postDelay的区别?(字节跳动)
10.IdleHandler是什么?怎么使用,能解决什么问题?
11.为什么Looper.loop不阻塞主线程?(腾讯)
12.Looper无限循环为啥没有ANR(B站)
13.Looper如何在子线程中创建?(字节跳动、小米)
14.Looper、handler、线程间的关系。例如一个线程可以有几个Looper可以对应几个Handler?(字节跳动、小米)
15.如何更新UI,为什么子线程不能更新UI?(美团)
16.ThreadLocal的原理,以及在Looper是如何应用的?(字节跳动、小米)
17.Android 有哪些存储数据的方式?
18.SharedPreference原理,commit与apply的区别是什么?使用时需要有哪些注意?(腾讯)
19.如何判断一个 APP 在前台还是后台?
20.如何做应用保活?
21.一张图片100x100在内存中的大小?(字节跳动)
22.Intent的原理,作用,可以传递哪些类型的参数?
然后会再扩展到和这些知识点相关的更深层次的知识点细节,直到问的你答不上来为止,以此来探寻你的技术边际,这样就能更深入地了解你的技术能力。
Android Framework重要性
Android Framework 开发虽然比较偏底层,圈子窄,但是能掌握一些原理的东西,可以触类旁通,往应用层发展也可以,接下来我们看看Framework知识有多重要。举几个栗子,你或许就能清楚了。
像掉帧监控,函数插装,慢函数检测,ANR 监控,启动监控,都需要对 Framework 有比较深入的了解,才能知道怎么去做监控,利用什么机制去监控,函数插桩插到哪里,反射调用该反射哪个类哪个方法哪个属性……
目前大公司的app开发都要基于模块化、层次化、组件化、控件化的思路来设计架构,而这一切的基础都建立在Android Framework系统框架底层原理实现之上。
Binder是Android系统中最重要的组成
Binder是什么呢?请看下图,图是最能清楚明了的直观表达的工具
优势描述
性能:只需要一次数据拷贝,性能上仅次于共享内存
稳定性:基于C/S架构,职责明确,架构清晰,因此稳定性好
安全性:为每个App分配UID,进程的UID是鉴别进程身份的重要标志
Android IPC Binder机制包含了 :Linux预备知识、传统的Linux中IPC通信原理、Binder IPC通信原理和Binder Java层实现,这些里面都各有好多小分支,小细节需要仔细的去学习掌握。
腾讯高级工程师Binder面试
1.为什么 Android 要采用 Binder 作为 IPC 机制?
2.Binder到底是什么?
3.Binder机制是如何跨进程的?
4.一次Binder通信的基本流程是什么样?
5.为什么 Activity 间传递对象需要序列化?
6.四大组件底层的通信机制是怎样的?
7.AIDL 内部的实现原理是什么?
这些都是关于Binder机制面试时会问到的点。
Handler主要用于异步消息的处理: 有点类似辅助类,封装了消息投递、消息处理等接口。当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分在消息队列中逐一将消息取出,然后对消息进行处理,也就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。
2、为什么要用handler?
为什么要用handler?不用这种机制行不行?不行!android在设计的时候,就封装了一套消息的创建、传递、处理机制,如果不遵循这种机制,就没有办法更新UI信息,就会抛出异常信息。
在android开发中,经常会在子线程中进行一些操作,当操作完毕后会通过handler发送一些数据给主线程,通知主线程做相应的操作。探索其背后的原理:子线程handler主线程其实构成了线程模型中的经典问题生产者-消费者模型。生产者-消费者模型:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加数据,消费者从存储空间中取走数据。