
文章目录
其实毫不夸张的说,现在安卓面试80%的题目都是面的任玉刚大佬《Android艺术开发探索》中的内容,我最近也在狂补书中的内容,这里做一个标题党,总结书中的本人觉得重要的知识点和要点,以便记忆。后续还会总结几篇,如果有时间的话。
大佬的书真的非常有价值,我如获至宝,许多知识点都是平常见到了,没去细想。所以有一句话不知道当讲不当讲:过去的经历如果不去总结,就只能叫经过!
共勉!
线程和线程池
线程和进程的区别?
- 一个程序至少有一个进程,一个进程至少有一个线程
进程是资源分配的最小单位,进程是程序执行过程的最小单位,(有了协程后,这个描述就不准确了)
线程是程序执行的最小单位(协程替代),包含了自己的工作内存,状态信息。
进程和线程的区别
多线程同步的方法有哪几种?
利用wait(), notify(), notifyAll(),或者wait(), join()方法实现线程同步
安卓异步的实现有哪些方式?
- AsyncTask
- 实现原理,多个异步任务是串行执行还是并行执行的?
- HandlerThread
- 主要用在哪些地方,实现原理是是什么
- IntentService
- 单个Thread
- 线程池
线程池有哪几种?有哪些区别?
- newFixedThreadPool
- 包含了固定数量的线程,线程没有占用时,不会回收。
- newCacheThreadPool
- 线程数量不定的线程池,只有非核心线程,可以根据资源最大值来设置,并且有超时限制。
- newSingleThreadPool
- 单个串行的核心线程,每个任务执行,是按顺序执行
- newScheduledThreadPool
- 包含核心线程和非核心线程,非核心线程不执行时,会被回收,可定时,周期性的执行的线程池
Bitmap缓存
Bitmap像素ARGB值的计算
- 理解色域的概念,不同色域计算方式不同
- 计算hsv 数组
- 调用
Color.HSVToColor(hsv)
private int getColorAtPoint(float eventX, float eventY) {
float x = eventX - centerX;
float y = eventY - centerY;
double r = Math.sqrt(x * x + y * y);
float[] hsv = {0, 0, 1};
hsv[0] = (float) (Math.atan2(y, -x) / Math.PI * 180f) + 180;
hsv[1] = Math.max(0f, Math.min(1f, (float) (r / radius)));
return Color.HSVToColor(hsv);
}
文件图像的大小计算
- 文件,资源,网络加载的图片,加载到手机内存中,占用大小一般不同,假如一个
1024*1024
的图片,以ARGB_8888格式的像素点为例,一般占用就是1024*1024*4=4M
,如果是res/drawable-xdpi目录,大小还不一样。
图片文件的两次读取
- BitmapFactory读文件有四个方法:
decodeResource()
decodeStream()
decodeFile()
decodeByByteArray()
- 使用
BitmapFactory.Options.inSampleSize
可以缩放图片大小。 BitmapFactory.Options.inSampleSize
一般是2的倍数,图片的宽和高变成1/inSampleSize
- 读取图片时,采用两步读取:
先获取图片原始的宽和高信息
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFActory.decodeResource(res, resId, options);
上面会得到图片原始大小
图片文件的采样率优化
图片采样率大小根据原始图片宽高,和展示的目标宽高做一个缩放,计算缩放比:
options.inSampleSize = caculateInSampleSize(options, desWidth, desHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResouces(res, resId, options);
然后再解析图片,就得到接近目标宽高的图片大小。
性能优化
性能优化包含许多优化内容,包括:
- 布局优化
- 绘制优化
- List优化
- 响应速度优化
- 缓存优化
- Bitmap优化
- 线程优化
- 编码优化
布局优化
布局优化,主要目的是为了减少视图的层级,进而减少不必要的事件分发,测绘,布局,绘制方法。可以从这几方面着手:
- 使用
<include>
标签,配合<merge>
标签,减少布局层次 - 使用
<ViewStub/>
组件来隐藏一开始不用展示的组件。 - 使用
LinearLayout
有限的替换RelativeLayout
绘制优化
- 主要在
onDraw()
方法中,尽量少的执行耗时方法。
list列表优化
- 自定义ViewHolder复用布局。
响应速度优化
- 避免在主线程中做过多的耗时操作
- 出现ANR,去看trace文件找问题
内存泄露优化
- 单例引用对象,没有释放。
- 静态变量导致Activity没法销毁等
- 无限循环属性动画没有被停止
- 编码规范
- 使用MAT工具,AS 自带的Profile工具检测。
缓存优化
- 三级缓存优化-网络,
LruCache + DiskLruCache
- 数据库持久化
Bitmap优化
上文中,Bitmap缓存,有讲到, 结合缓存优化,效果更佳。
线程优化
- 采用线程池,避免过多的创建线程,虽然线程池可以重用,但大量创建和销毁线程会造成许多损耗。