1.RecyclerView LayoutManager 的作用是什么,如何自定义LayoutManager,写出思路
它能够构造复杂的、流畅的滑动列表。
- 计算每个ItemView的位置;
- 添加滑动事件;
- 实现缓存。
2. volatile
一个变量如果用volatile修饰了,则Java可以确保所有线程看到这个变量的值是一致的,如果某个线程对volatile修饰的共享变量进行更新,那么其他线程可以立马看到这个更新,这就是所谓的线程可见性。
相对于synchronized稍微轻量些
使用它必须满足如下两个条件:
2.1对变量的写操作不依赖当前值;
2.2该变量没有包含在具有其他变量的不变式中。
3.如何判断一个应用在前台
ActivityLifecycleCallbacks监听实现
RunningTask判断 5.0前准确
4.如何在Activity之间传递一个Bitmap
使用Bundle的putByteArray,先压缩图片:
使用Bundle putParcelable。
5. Vector & ArrayList &CopyOnWriteArrayList
这三个集合类都继承List接口
5.1、ArrayList是线程不安全的;
5.2、Vector是比较古老的线程安全的,但性能不行,一旦其他线程也在操作,将会报ConcurrentModificationException错误;
5.3、CopyOnWriteArrayList在兼顾了线程安全的同时,又提高了并发性,性能比Vector有不少提高,是将数组拷贝一份出来进行修改,不被其他线程的操作影响,采用“写入时复制”策略,对容器的写操作将导致的容器中基本数组的复制,性能开销较大,数据大的时候容易造成溢出
6给一张切图的单位是px,如何给不同屏幕适配,转换dp方式
1080p 1dp =3px 720p 1dp = 2px 480p 1dp = 1.5px
7. 线程如何中断,wait(),nofity()原理
终止线程的三种方法:
1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 (volatile boolean exit = false)
2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
3. 使用interrupt方法中断线程。
Notify()是通知操作系统唤醒一个正在等待的获取对象锁的线程,当有多个等待线程时候, 操作系统会根据一定的调度算法调度一个线程,当正在占有对象锁的线程释放锁的时候操作系统调度的这个线程就会执行。而而剩下的那些没有被notify的线程就不会获取执行机会。
对象的wait()是让当前线程释放该对象Monitor锁并且进入访问该对象的等待队列,当前线程会进入挂起状态,等待操作系统唤起(notify)挂起的线程重新获取对该对象的访问锁才能进入运行状态。
8.Android事件分发机制
dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()分发 拦截 处理;事件分发流程 = Activity-> ViewGroup -> View 图转自https://www.cnblogs.com/aademeng/articles/6551337.html
9. scrollview添加listview 加载更多图片没有释放导致的内存溢出
http://blog.csdn.net/qeqeqe236/article/details/7335676/应该可以解决
LruCache<String,Bitmap> mImageCache;存放图片
10.主题切换
Theme设置不同的适配属性attr通过调用setTheme()但是需要重启应用
https://www.jianshu.com/p/af7c0585dd5b框架解决方案
11.rsa加密
RSA加密算法加密时间很短,基本可以忽略不计。但是,在解密时,RSA显的比较匹配,解密时间与解密文件的大小呈现线性增长趋势。加密1M的文件大概需要5秒,但是解密却需要4分钟。
2)加密后的文件与原始文件的大小基本相同
3)解密的效率远低于加密效率,按照这个时间去计算,加密1G的文件需要1分钟,但是解密却需要65小时
12.https的原理
转自http://blog.jobbole.com/110354/
Https协议最重要的一步就是最开始建立的信任。以后的密钥,以及其他信息的交换都基于最开始的信任。那么最开始的信任是怎么建立的呢。客户端向服务器发起请求后,服务器会传给客户端一个证书,然后客户端会根据本地根证书验证客户端证书的合法性,包括证书有效时间,证书绑定的域名和访问的域名对比等等,如果通过,则用证书中的公钥加密客户端生成的对称密钥并传送给服务端。注意!用证书中的公钥很关键,这样就可以防止信心被中间人劫持,发给你一个假的公钥。因为证书和域名绑定,所以无法伪造。这样只要证书验证通过,以后的通话就可以安全的进行。而你所说的客户端和服务端交换彼此的非对称密钥进行加密,无法保证你收到的密钥一定是客户端的,建立在密钥安全性无法保证的前提的通信当然是不安全的。故而客户端通过http和rsa加密合成的请求不安全
13. Glide特点 与ImageLoader
Glide支持常见图片格式 Jpg png gif webp
支持多种数据源 网络、本地、资源、Assets 等
高效缓存策略 支持Memory和Disk图片缓存 默认Bitmap格式采用RGB_565内存使用至少减少一半
生命周期集成 根据Activity/Fragment生命周期自动管理请求
高效处理Bitmap 使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力,相较于imageloader更流畅一些
如果使用 Glide,建议将 Bitmap 格式换成 ARGB_8888、让 Glide 缓存同时缓存全尺寸和改变尺寸两种。
ImageLoader的工作原理是这样的:在显示图片的时候,它会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。
此外,由于ImageLoader对图片是软引用的形式,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收)。
基于这个原理,我们可以在每一次退出一个页面的时候,把ImageLoader内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。
14.LruCache 缓存策略
LruCache 是对限定数量的缓存对象持有强引用的缓存,每一次缓存对象被访问,都会被移动到队列的头部。当有对象要被添加到已经达到数量上限的 LruCache 中,队列尾部的对象将会被移除,而且可能会被垃圾回收器回收。LruCache中的 Lru 指的是“Least Recently Used-近期最少使用算法”。这就意味着,LruCache 是一个能够判断哪个缓存对象是近期最少使用的缓存对象,从而把最少使用的移至队尾,而近期使用的则留在队列前面了。举个例子:比如我们有a、b、c、d、e五个元素,而a、c、d、e都被访问过,唯有b元素没有访问,则b元素就成为了近期最少使用元素了,就移至在队尾了