sharedPreferences的apply和commit区别,多进程下是否可以使用
https://www.jianshu.com/p/918240c01644
apply是异步的,commit是同步的
apply是先将数据写入到内存然后单线程地完整写入文件,commit则是直接写入文件,
apply是void类型,commit返回boolean,是否成功写入
多线程安全,但多进程下不可用,
卡顿优化(如果头条APP卡了,可能发生的原因有哪些),布局优化(include、viewStub、merge 的使用和区别),自己做过哪些优化,异常机制,代码混淆有了解过吗
RecyclerView的预取机制与缓存机制
RecycleView的四级缓存——结构
mAttachedScrap(屏幕内):用于屏幕内itemview快速重用,不需要重新createView和bindView
mCacheViews(屏幕外):保存最近移出屏幕的ViewHolder,包含数据和position信息,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。
mViewCacheExtension(自定义缓存):不直接使用,需要用户自定义实现,默认不实现
mRecyclerPool(缓存池):当cacheView满了后或者adapter被更换,将cacheView中移出的ViewHolder放到Pool中,放之前会把ViewHolder数据清除掉,所以复用时需要重新bindView
保存缓存流程:
https://blog.csdn.net/jb_home/article/details/111647931
插入或是删除itemView时,先把屏幕内的ViewHolder保存至AttachedScrap中
滑动屏幕的时候,先消失的itemview会保存到CacheView,CacheView大小默认是2,超过数量的话按照先入先出原则,移出头部的itemview保存到RecyclerPool缓存池(如果有自定义缓存就会保存到自定义缓存里),RecyclerPool缓存池会按照itemview的itemtype进行保存,每个itemType缓存个数为5个,超过就会被回收。
获取缓存流程:
AttachedScrap中获取,通过pos匹配holder——>获取失败,从CacheView中获取,也是通过pos获取holder缓存 ——>获取失败,从自定义缓存中获取缓存——>获取失败,从mRecyclerPool中获取 ——>获取失败,重新创建viewholder——createViewHolder并bindview。
WebView如何做资源缓存?WebView的5种缓存模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据
WebView和JS交互的几种方式与拦截方法。
https://www.jianshu.com/p/345f4d8a5cfa
Android调用JS:loadUrl()
、evaluateJavascript()
【evaluate:评估】
JS调用Android:通过addJavascriptInterface()
进行对象添加、通过WebViewClient.shouldOverrideUrlLoading()
回调拦截url、通过WebChromeClient的onJsAlert()
、onJsConfirm()
、onJsPrompt()
方法回调拦截JS对话框消息
解释安卓为啥要加签名机制
权限管理系统(底层的权限是如何进行 grant 的)