一. 图片相关?
1.三级缓存:
当我们第一次打开应用获取图片或其它资源时,首先到网络去下载,然后依次存入内存缓存,磁盘缓存,
当我们再一次需要用到刚才下载的这张图片时,就不需要再重复的到网络上去下载,直接可以从内存缓存和磁盘缓存中找,由于内存缓存速度较快,我们优先到内存缓存中寻找该图片,如果找到则运用,
如果没有找到(内存缓存大小有限),那么我们再到磁盘缓存中去找。
只要我们合理的去协调这三层缓存运用,便可以提升应用性能,给用户更好的体验
三级缓存指的是:内存缓存、本地缓存、网络缓存。其各自的特点是内存缓存速度快, 优先读取,本地缓存速度其次, 内存没有该资源信息就去读取本地内存,网络缓存速度较慢(比较对象是内存缓存和本地缓存),假设本地内存也没有,才请求网络获取。
2.图片优化,以及图片加载框架的使用,如Picasso、 Fresco、Glide等?
1)尽量使用小的图片,对图片进行压缩,bitmapfactory.options图片配置类,insimplesize进行缩放,设置图片的编码方式;对图片使用软引用,内存不够时即时释图片内存;对图片的复用,三级缓存的使用;
即时回收不再使用的bitmap对象;
2)Picasso,不支持gif,缓存的是Argb8888的原图,占用内存较大,图片的框架使用了OkHttp缓存机制,使用Http协议缓存,也是异步加载.
3)Fresco,框架是FaceBook公司推出的,适合批量加载图片,底层是通过三级缓存(2级内存,1级磁盘)
加载成功后自动替换成目标图片
4)glide,Google公司14年推出来的,可以加载GIF图,也可以根据指定图片清晰度,底层的原理:为Bitmap维护一个对象池,对象池的目的是通过减少对象的分配,以重用来提高性能.对象池也可以帮助提高滚动的性能。API简洁易调用
二.基础知识?
1.Android下的数据存储方式有那些?
1)内部存储,直接存储在内部文件中
2)外部存储,首先要判断外部存储条件是否可用,然后进行存储
3)SP存储,底层是Xml实现的,以键值对形式存储内部的数据,适宜于轻量级的存储,存储的数据类型有,boolean,String,int
4)数据库存储,SQlite存储,轻量级的数据库,强大的增删改查功能
5)内容提供者,ContentProvider,将自己愿意暴露的一部分数据供外部使用操作
6)网络存储,等等
Sharepreference 线程安全问题?
官方文档明确指出,SharedPreferences不支持多线程,进程也是不安全的
如果想要实现线程安全需重新实现其接口,如下
prvite static final class SharedPreferenceImpl implements SharePreference{}
假设在多进程访问SharePreferences的情况下,该如何保证进程安全和共享数据?
解决办法就是:将需要共享数据的字段提出来统一存储到一个文件中。
2.对象序列化:
为什么要序列化?
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
在Android中实现序列化有两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。实现Serializable接口简单,声明即可,而实现Parcelable接口复杂,但效率更高,推荐用这种方法提高性能。两种实现方式依旧是贴url,方便大家快速查询
两种序列化相关
既然Google推荐Parcelable这种序列化,在这里,推荐一键生成序列化的插件,
在Android Studio里面搜索插件,如下图,写起序列化(根本不用你写)。