Android面试题或者知识点(持续更新中)

本文涵盖了Android面试中的核心知识点,包括计算机网络、图片处理、缓存策略、线程与线程池、Handler机制、框架如RxJava、Glide、OkHttp、Jetpack以及四大组件、性能优化等内容,深入探讨了Android开发的各个方面,旨在帮助开发者准备面试和提升技术水平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机网络

tcp udp

TCP与长链接

TCP的三次握手四次挥手

TCP链接校验可靠性

TCP和UDP区别

UDP可靠传输

长链接重试机制

http

不同版本HTTP的区别

一次完整的网络请求流程

https请求的过程中是一种加密还是两种加密

socket 四元组 ip:port ip:port

Socket保证信息序列

Socket保证信息链接

图片bitmap

bitmap

基本介绍:

Bitmap有四种存储方式,对应Bitmap.Config中的四个常量:

ALPHA_8:只存储透明度,不存储色值,1个像素点占1个字节;

ARGB_4444:ARGB各用4位存储,1个像素点16位占2个字节;

ARGB_8888:ARGB各用8位存储,1个像素点32位占4个字节;

RGB_565:只存储色值,不存储透明度,默认不透明,RGB分别占5,6,5位,一个像素点占用16位2个字节。

一般情况下,我们不会使用 ALPHA_8 ,他只存储透明度,没啥用处。对于 ARGB_4444 ,它的画质又太感人了,ARGB_8888 画质高但是占内存, RGB_565 还行,就是不可以设置透明度

一般情况下用ARGB_8888格式存储Bitmap;

ARGB_4444画面惨不忍睹,被弃用;

假如对图片没有透明度要求,可以使用RGB_565,比ARGB_8888节省一半的内存开销。

密度(dpi,dots per inch;或PPI,pixels per inch)。从英文顾名思义,就是每英寸的像素点数,数值越高当然显示越细腻。假如我们知道一部手机的分辨率是1080×1920,屏幕大小是5英寸,你能否算出此屏幕的密度呢?哈哈,中学的勾股定理派上用场啦!通过宽1080和高1920,根据勾股定理,我们得出对角线的像素数大约是2203,那么用2203除以5就是此屏幕的密度了,计算结果是440。440dpi的屏幕已经相当细腻了

dpi为单位像素的密度,就是每英寸所占的密度
= 开根号(1080 * 1080 + 1920 * 1920) /5.2

1dp = dpi/160*1dp(px)

计算一张图片占用内存的大小?

  • 公式:内存大小 = 宽 * 高 * 单个像素点所占字节数

  • Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.earth);
         Log.e("TAG","图片的宽=520,图片的高=618");
         Log.e("TAG","bitmap width = "+bitmap.getWidth());
         Log.e("TAG","bitmap height = "+bitmap.getHeight());
         Log.e("TAG","bitmap size = "+bitmap.getByteCount());
    打印      
          图片的宽=520,图片的高=618
    bitmap width = 247
    bitmap height = 208
    bitmap size = 205504
    247 * 208 * 4 =  205504
    520 * 618 * 4 = 1285440
    

    打印的结果可以看出,占用内存的实际大小,并不是按照图片的宽高来算,而是按照Bitmap的宽高来算。

bitmap的回收 怎么回收

  • 在Android4.0-8.0以下,内存分配在java层,由GC回收。

  • 在Android8.0以上,NativeAllocationRegistry是Android 8.0引入的一种辅助自动回收native内存的一种机制,当Java对象因为GC被回收后,NativeAllocationRegistry可以辅助回收Java对象所申请的native内存

  • 在安卓8.0以下版本,内存是创建在java层。8.0以上版本,内存是创建在native层 首先会创建一个原图内存,然后如果不需要缩放,则把最终的图片指向原图。如果需要缩放,则根据内存的复用判断等,新开辟一个缩放内存

  • 8.0以上手机可以调用recycle()可以回收native的内存 8.0以下手机可以调用recycle()不可以回收java的内存。可见由JVM的GC回收。也可以调用对象的finalze 方法

    Bitmap图片显示为400,实际图片为4000的解决方案

    Bitmap缩放

    可设置以下代码

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inDensity = 1;
    options.inTargetDensity = 1;

    Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.zoro,options).copy(Bitmap.Config.ARGB_8888, true);

​ 原因主要是在native代码中对像素做了处理。

public Bitmap decodeSampleFromBitmap(Resources resources, int resId, int reqWidth, int reqHeight) {
    //建立一个位图工厂的设置选项
    BitmapFactory.Options options = new BitmapFactory.Options();
    //设置该属性为true,解码时只能获取width、height、mimeType
    options.inJustDecodeBounds = true;
    //解码
    BitmapFactory.decodeResource(resources, resId, options);
    //计算采样比例
    int inSampleSize = options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight);
    //设置该属性为false,实现真正解码
    options.inJustDecodeBounds = false;
    //解码
    Bitmap bitmap = BitmapFactory.decodeResource(resources, resId, options);
    return bitmap;
}

public int calculateSampleSize(BitmapFactory.Options option, int reqWidth, int reqHeight) {
    //得到图片的原宽高
    int width = option.outWidth;
    int height = option.outHeight;

    int inSampleSize = 1;
    if (width > re
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小阳世界2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值