计算机网络
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