通往架构师的一天 之项目架构-webview2

   接上文 我们在上篇文章里 已经成功的把webview 添加到activity里 并在APPmodule里成功的跳转到了WebActivity 并且加载了百度 

下面我们要把webview展示在fragment里 

fragment代码

首先我们新建一个fragment 并且把activity里的webview 移动到fragment的布局里 同时使用activity加载fragment

activity代码

接着我们在IWebViewService 添加一个getWebFragment 方法 通过ServiceLoader拿到IWebViewService的实现类 就可以获取到WebViewFragment了

获得fragment代码

这时候我们发现 在加载网页的时候会白屏一下 这种体验是不好的 于是我们要引入loading 的动画

我们在base module里添加 api'com.kingja.loadsir:loadsir:1.3.6'                implementation'com.airbnb.android:lottie:2.8.0' 两个库

同时把loading的动画布局以及资源拷贝到base的res目录下

同时在base module里添加BaseApplication 继承applation 保存一个静态的context对象备用 

之所以保存这个对象是因为这里的context绑定应用的生命周期 使用这个不会产生内存泄漏 

在一些用到非界面相关的context 就可以使用这个 例如打开数据库等操作防止内存泄漏

BaseApplication

下面我们在APPmodiule下新建我们自己的applation 继承BaseApplication 并且初始化loadsir

这样我们就可以在WebViewFragment 里引入loadsir的loading了

这时我们要思考怎样才能获得webview各种加载状态 同时展现界面呢

我们知道 webview 相关的主要有四个部分 WebViewClient (负责view 状态相关) WebChromeClient (负责浏览器内核相关)JSBridge (负责js交互)以及WebSetting(设置一些属性)

这里我们要监听webview的加载状态 就需要设置WebViewClient 

我们自定义一个WebViewClient 继承自WebViewClient并且重写onPageStarted onPageFinished onReceivedError 三个方法 监听webview的加载状态

那么我们怎么把这些状态回调给我们的界面(fragment)呢 ?

需要定义一个IWebClientListener 接口同时 在MyWebViewClient 构造方法里传入接口的实现

接下来 我们在fragment里实现IWebClientListener 并且给new MyWebViewClient 给webview设置WebVoewClient 我们就能在fragment里监听到webview各种加载的状态 同时展示不同的加载页面了

mBinding.webViewFragment.setWebViewClient(new MyWebViewClient(this));

这样我们就实现了在网页不同的加载状态展示不同的加载中界面

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。