最后
在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
// 根据路径加载
public static Bitmap decodeFile(String pathName, Options opts);
// 加载drawable或mipmap中的图片
public static Bitmap decodeResource(Resources res, int id, Options opts)
// 根据字节流加载
public static Bitmap decodeByteArray(byte[] data, int offset, int length)
// 根据IO流加载
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts)
图片的优化可通过Options参数来实现(Options的介绍可参考从fresco 看图片优化):
方式一:inSampleSize
inSampleSize可理解为图片的缩小比例,若inSampleSize小于1,则当做1处理。设置inSampleSize后,图片的宽度和高度将变成原来的1/inSampleSize, 其占用的内存空间将是原来的1/(inSampleSize ^ 2)。但是具体如何取值呢,可通过以下代码来获取:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.drawable.image, options);
options.inSampleSize = getSampleSize(options, 100, 100);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.abc, options);
imageView.setImageBitmap(bitmap);
public static int getSampleSize(BitmapFactory.Options options, int viewWidth, int viewHeight) {
if (viewWidth == 0 || viewHeight == 0 || options == null) {
return 1;
}
int widthScale = options.outWidth / viewWidth;
int heightScale = options.outHeight / viewHeight;
Log.i(“out”, “width==” + widthScale + " heightScale==" + heightScale);
return widthScale >= heightScale ? heightScale : widthScale;
}
方式二:inDensity
inDensity相当于上面说的资源目录分辨率,前面说了,这里考虑的情况,图片不会被缩放,其原因就是inDensity和设备分辨率的取值是一致的,因为inDensity=设备分辨率,所以scale=1, 如果将inDensity设置为大于设备分辨率的值,那么图片就会被缩小。例如,当前的手机1dp=2px, 即2X屏幕,此时的inDensity为320, 如果将inDensity修改为480, scale=320f/480f=2/3, 那么图片所占用的内存将变成原来的4/9。
方式三:inPreferredConfig
inPreferredConfig的取值为Bitmap.Config类型(这里只考虑以下几种情况),它是一个枚举类型,用来设置每个像素需要的字节数:
ALPHA_8:占1个字节
RGB_565:占2个字节
ARGB_4444:占2个字节,已废弃,不推荐使用
ARGB_8888:32位真彩色,带透明度,占4个字节
显示图片时默认都是ARGB_8888,所以我们可通过inPreferredConfig的值进行内存优化。但实际上inPreferredConfig的取值对内存的影响并不是简单的Bitmap.Config.ALPHA_8占1个字节,ARGB_4444和RGB_565占2个字节,ARGB_8888占4个字节,而是与具体的图片格式有关:
- inPreferredConfig对jpeg和gif格式的图片无作用,无论inPreferredConfig的值取什么,jpeg格式的图片每个像素始终占用4个字节,而gif格式的图片每个像素始终占1个字节;
- 对于webp格式的图片,inPreferredConfig取值为RGB_565的时候,每个像素占用2个字节,其余的取值每个像素仍然占4个字节;
- 对于png格式的图片,需要分png8, png24, png32三种情况来说。png8格式的图片每个像素占用的字节数随inPreferredConfig的取值而变化,取值为ALPHA_8时占用一个字节,取值为RGB_565时占用2个字节,取值为ARGB_4444或ARGB_8888时占用4个字节。png24格式的图片,当inPreferredConfig的取值为RGB_565时,每个像素占用2个字节,取其他的值(ALPHA_8, ARGB_4444和ARGB_8888)每个像素都占用4个字节。而对于png32格式的图片,inPreferredConfig的取值(ALPHA_8, RGB_565, ARGB_4444或ARGB_8888)对每个像素占用的字节数无影响。
所以,如果通过inPreferredConfig来优化图片的内存占用,就需要webp或png24格式的图片,png24与png32相比,也就是不支持透明度而已,对于大多数图片来说,两者没有明显的差别。当然,作为一种新的图片格式,web可认为是一种不错的选择。
注意: 9patch图虽然在使用时会根据View的尺寸进行放大,但其像素仍然不变,可视为普通图片来处理;
网络图片
网络图片通常我们都是使用开源库进行加载(这里顺便推荐一个好用的图片加载库ImageSet), inPreferredConfig的值通常可在初始化时进行配置,至于缩放,可让后台进行实现。即:根据图片的请求参数返回合适的尺寸。最大也只需要控件的大小即可,再大也没意义,不仅浪费流量,还占用内存。如果你的APP中有很多图片,那么可对图片的宽高根据设备的内存情况进行适当的缩小:
// 根据内存大小设置缩放系数
public static float getDefaultScale() {
float scale = 1.0f;
int totalMemorySize = AndroidPlatformUtil.getTotalMemorySize();
if (totalMemorySize >= 4) {
scale = 1.0f;
} else if (totalMemorySize >= 2 && totalMemorySize < 4) {
scale = 0.8f;
} else {
scale = 0.6f;
}
return scale;
}
// 获取设备的内存大小,返回值单位为G
public static int getTotalMemorySize(){
String path = “/proc/meminfo”;
String firstLine = null;
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try{
fileReader = new FileReader(path);
bufferedReader = new BufferedReader(fileReader,8192);
firstLine = bufferedReader.readLine().split(“\s+”)[1];
} catch (Exception e){
e.printStackTrace();
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
} catch (Exception e) {
e.printStackTrace(System.out);
}
try {
if (fileReader != null) {
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
.csdn.net/topics/618156601)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!