![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190606104746.png)
## WebView 的一些坑
1. Android 16 及其以前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确的限制使用 WebView.addJavascriptInterface 方法,远程攻击者可以通过 Java Reflection(反射)API利用该漏洞任意执行 Java 对象的方法。
2. WebView 内存泄漏。要先从父 View 移除 WebView 以后,再销毁 WebView
3. webviewClient.onPageFinished 方法可能存在无限跳转问题,而 WebChromeClient 的 onProgressChanged方法更加靠谱点。
4. 后台耗电:开启了 Webview 以后, WebView 开启了单独的进程,如果没有及时的销毁,可能这些子线程一直在运行,耗电增加
5. WebView 硬件加速导致页面渲染问题(暂时关闭 硬件加速)
## 解决WebView 的内存泄漏问题
WebView 执行操作的时候,是在新的线程中的,但是在创建 WebView 的时候会关联我们的 Activity。 Activity 的生命周期和 WebView 线程的生命周期是不一样的,如果这个时候 Activity 销毁了,但是 WebView 还是在运行的,导致 WebView 会一直持有 Activity 的引用,不能让 Activity 回收,就导致了内存泄漏。
1. 开启一个进程,让 WebView 独立运行在一个进程
2. 创建 WebView 的时候使用 ApplicationContext,或者对传入的 Context 使用弱引用。创建完毕以后动态添加到 父 VIew。然后在 Activity 销毁的时候先从父 View 移除,然后再销毁 WebView。
- Java 面试题
- String、StringBuffer、StringBuilder 的区别?
- Java 中的四种引用
- 接口和抽象类的本质区别
- 集合框架
- 集合概述
- ArrayList 源码分析
- LinkedList 源码分析
- HashMap 源码分析
- LinkedHashMap 源码分析
- Android提供的 LruCache 的分析
- LinkedList 和 ArrayList 的区别
- 多线程
- 实现多线程的几种方式
- 线程的几种状态
- Thread 的 start() 和 run() 的区别
- sleep() 、yield() 和 wait() 的区别 ?
- notify() 和 notifyAll() 的区别?
- 保证线程安全的方式有哪几种?
- Synchronized 关键字
- volatile 和 synchronized 的区别?
- 如何正确的终止一个线程?
- ThreadLocal 原理分析
- 线程池
- 多线程的三个特征
- 五种线程池,四种拒绝策略,三种阻塞队列
- 给定三个线程如何顺序执行完以后在主线程拿到执行结果
- Java 内存模型
- 判定可回收对象算法
- equals 与 == 操作符
- 类加载机制
- 类加载简单例子
- 算法
- 时间、空间复杂度
- 冒泡排序
- 快速排序
- 链表反转
- IO
- 泛型
- Kolin 面试题
- Android 面试题
- Handler 线程间通信
- Message、MessageQueue、Looper、Handler 的对象关系
- Handler 使用
- Handler 源码分析
- HandlerThread
- AsyncTask
- IntentService
- 三方框架
- Rxjava
- rxjava 操作符有哪些
- 如何解决 RxJava 内存泄漏
- Rxjava 线程切换原理
- map和 flatmap 的区别
- Databinding引起的 java方法大于 65535 的问题
- Glide
- Glide 的缓存原理
- Glide 是如何和生命周期绑定的?不同的Context 有什么区别?
- Glide 、Picasso 、的区别,优劣势,如何选择?
- Jetpack
- 源码分析
- EventBus
- EventBus 源码分析
- RxBus 替代 EventBus
- OkHttp
- OkHttp 源码分析
- OkHttp 缓存分析
- RxPermission
- RxPermission 源码分析
- Retrofit
- create
- Retrofit 源码分析
- 优化
- 启动优化
- 布局优化
- 绘制优化
- 内存优化
- 屏幕适配
- 组件
- Activity
- Frgment
- Service
- ContentProvider
- BroadcastReceiver
- 进程间通信
- Binder机制和AIDL
- AILD 中的接口和普通的接口有什么区别
- in、out、inout 的区别
- Binder 为什么只需要拷贝一次
- 在android中,请简述jni的调用过程
- 生命周期
- Activity 生命周期
- Fragment 生命周期
- Service 生命周期
- onSaveInstanceState() 与 onRestoreIntanceState()
- 前沿技术
- 组件化
- 模块化
- 插件化
- 热更新
- UI - View
- Android 动画
- 事件分发机制
- WebView
- 系统相关
- 谈谈对 Context 的理解
- Android 版本
- App应用启动流程
- App 的打包
- App 的加固
- App 的安装
- Activity 启动流程
- ClassLoader
- Lru 算法加载 Bitmap 三级缓存原理
- Parcelable 和 Serializable 的区别
- Activity的启动流程
- 相关概念
- 网络相关
- Http
- Https
- Http 和 Https 的区别
- 为什么要进行三次握手和四次挥手?
- OkHttp使用Https访问服务器时信任所有证书
- 设计模式
- 单例模式
- 构建者模式
- 工厂模式
- 外观模式
- 代理模式