做牛仔裤的视频网站,wordpress 文章 来源,软件开发模型对比,做网站需要哪些栏目文章目录 一、WebView 加载流程时序图二、WebView 加载流程回调函数说明三、AwContents3.1 主要功能和职责3.2 架构和实现3.3 使用场景 四、利用WebView回调函数检测白屏4.1 使用onPageStarted和onPageFinished检测加载时间4.2 利用onReceivedError和onReceivedHttpError检测加… 文章目录 一、WebView 加载流程时序图二、WebView 加载流程回调函数说明三、AwContents3.1 主要功能和职责3.2 架构和实现3.3 使用场景 四、利用WebView回调函数检测白屏4.1 使用onPageStarted和onPageFinished检测加载时间4.2 利用onReceivedError和onReceivedHttpError检测加载错误4.3 使用shouldInterceptRequest监控资源加载4.4 使用onPageCommitVisible4.5 结合JavaScript和evaluateJavascript 五、结论 在Android开发中WebView用于显示网页和执行JavaScript。理解其加载流程和事件回调对于开发一个功能丰富且用户友好的基于Web的应用至关重要。本文将详细介绍 WebView 加载一个URL时的整个流程和相关的事件回调帮助开发者更好地掌握其使用方法和处理可能出现的问题。
一、WebView 加载流程时序图
当用户通过 WebView 加载一个URL时整个过程涉及多个组件和一系列复杂的交互。下面是一个 WebView 加载URL的时序图以及对每个回调事件的详细说明。 #mermaid-svg-nQbR99qT7268EIVO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nQbR99qT7268EIVO .error-icon{fill:#552222;}#mermaid-svg-nQbR99qT7268EIVO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nQbR99qT7268EIVO .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-nQbR99qT7268EIVO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nQbR99qT7268EIVO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nQbR99qT7268EIVO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nQbR99qT7268EIVO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nQbR99qT7268EIVO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nQbR99qT7268EIVO .marker.cross{stroke:#333333;}#mermaid-svg-nQbR99qT7268EIVO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nQbR99qT7268EIVO .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nQbR99qT7268EIVO text.actortspan{fill:black;stroke:none;}#mermaid-svg-nQbR99qT7268EIVO .actor-line{stroke:grey;}#mermaid-svg-nQbR99qT7268EIVO .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nQbR99qT7268EIVO .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nQbR99qT7268EIVO #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nQbR99qT7268EIVO .sequenceNumber{fill:white;}#mermaid-svg-nQbR99qT7268EIVO #sequencenumber{fill:#333;}#mermaid-svg-nQbR99qT7268EIVO #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nQbR99qT7268EIVO .messageText{fill:#333;stroke:#333;}#mermaid-svg-nQbR99qT7268EIVO .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nQbR99qT7268EIVO .labelText,#mermaid-svg-nQbR99qT7268EIVO .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-nQbR99qT7268EIVO .loopText,#mermaid-svg-nQbR99qT7268EIVO .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-nQbR99qT7268EIVO .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nQbR99qT7268EIVO .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nQbR99qT7268EIVO .noteText,#mermaid-svg-nQbR99qT7268EIVO .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-nQbR99qT7268EIVO .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nQbR99qT7268EIVO .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nQbR99qT7268EIVO .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nQbR99qT7268EIVO .actorPopupMenu{position:absolute;}#mermaid-svg-nQbR99qT7268EIVO .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nQbR99qT7268EIVO .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nQbR99qT7268EIVO .actor-man circle,#mermaid-svg-nQbR99qT7268EIVO line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nQbR99qT7268EIVO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户 WebView WebViewClient Native层 (AwContents) loadUrl() nativeLoadUrl() 页面加载开始 onPageStarted() 页面开始加载时调用通知应用页面加载已经开始。 shouldInterceptRequest (多次) WebView每次请求资源时调用允许应用拦截、修改或替换资源请求。 onLoadResource (多次) 加载页面资源时调用通知应用页面资源正在加载。 onFormResubmission() 用户尝试重新提交表单时调用询问用户是否重新提交表单。 onReceivedHttpAuthRequest() 需要HTTP认证时调用请求HTTP认证信息。 onReceivedClientCertRequest() 服务器请求客户端证书时调用提供客户端证书。 onReceivedSslError() SSL验证失败时调用处理SSL错误。 onReceivedHttpError() HTTP错误响应时调用处理HTTP错误。 onTooManyRedirects() 页面重定向过多时调用处理重定向问题。 onSafeBrowsingHit() 访问到被谷歌标记为不安全的网页时调用处理安全浏览警告。 shouldOverrideUrlLoading() WebView即将加载某个URL时调用决定是否由应用而非WebView处理该URL。 shouldOverrideKeyEvent() onUnhandledKeyEvent() onScaleChanged() onPageCommitVisible() 页面内容即将显示时调用通知页面内容即将可见。 页面开始显示 onPageFinished() 页面加载完成时调用通知应用页面加载已经完成。 页面加载完成 用户 WebView WebViewClient Native层 (AwContents) 上面的时序图提供了一个清晰的视图展示了从开始加载URL到页面加载完成的整个过程中WebView和WebViewClient的交互。每个回调都在特定的时机被触发以处理不同的事件和状态变化。
二、WebView 加载流程回调函数说明 触发加载 用户或应用触发 loadUrl() 方法开始加载指定的URL。 原生层处理 WebView 调用其底层实现通常是 AwContents 的 nativeLoadUrl() 方法来开始网络请求。 页面加载的各阶段
页面加载开始此时WebViewClient 的 onPageStarted() 方法被调用标志着页面加载的开始。资源请求拦截shouldInterceptRequest() 方法可能会被多次调用允许开发者拦截、修改或替换正在加载的资源。资源加载对于页面上的每个资源如图片、CSS文件等onLoadResource() 方法会被调用。
处理特殊事件 在加载过程中WebView 可能会遇到各种需要特殊处理的情况
表单重提交onFormResubmission() 被调用询问用户是否重新提交表单。HTTP认证请求onReceivedHttpAuthRequest() 请求HTTP认证信息。客户端证书请求onReceivedClientCertRequest() 提供客户端证书。SSL错误处理onReceivedSslError() 处理SSL验证失败的情况。HTTP错误处理onReceivedHttpError() 处理HTTP错误响应。重定向过多onTooManyRedirects() 处理页面重定向问题。安全浏览命中onSafeBrowsingHit() 处理访问到被标记为不安全的网页。
页面内容显示
页面即将可见onPageCommitVisible() 方法被调用标志着页面内容即将显示在屏幕上。页面加载完成最终onPageFinished() 方法被调用通知应用页面已完全加载。
每个回调方法都有其特定的用途例如shouldOverrideUrlLoading() 允许开发者决定是否拦截URL加载而 onScaleChanged() 则用于处理缩放事件。正确处理这些回调可以极大地增强应用的功能性和用户体验。
三、AwContents
本节介绍时序图中的AwContents。AwContents 是 Android WebView 的一个核心组件它在 Android WebView 架构中扮演着非常重要的角色。AwContents 是 Chromium 项目的一部分它负责管理 WebView 的内容渲染和事件处理。在 Android 系统中AwContents 作为 WebView 的底层实现提供了与 Chromium 引擎的直接交互接口。
3.1 主要功能和职责 内容渲染 AwContents 负责将网页内容渲染到 WebView 组件上。它使用 Chromium 的渲染引擎Blink来解析 HTML、CSS 和 JavaScript确保网页内容能够正确显示。 事件处理 它处理来自上层 WebView 和 WebViewClient 的各种事件和请求如页面加载、资源请求、导航事件等并将这些事件转发到 Chromium 引擎。 JavaScript 交互 AwContents 提供了与 JavaScript 代码交互的接口允许 Android 应用与网页中的 JavaScript 代码进行通信。 安全和隐私 它实现了多种安全措施如同源策略、内容安全策略等以保护用户的安全和隐私。 网络请求管理 AwContents 管理所有网络请求包括图片、CSS 文件、JavaScript 文件等资源的加载。它支持自定义网络请求的处理例如通过 shouldInterceptRequest() 方法拦截和修改请求。
3.2 架构和实现
AwContents 是一个桥接类它连接了 Android 的 WebView API 和 Chromium 的底层实现。在 Android WebView 的架构中AwContents 位于 Java 层和 native 层之间它通过 JNIJava Native Interface与 native 代码进行交互。
在 native 层AwContents 对应的实现是 content::WebContents这是 Chromium 中用于管理网页内容的核心类。WebContents 负责页面的生命周期管理、渲染进程管理和页面内容的实际渲染。
3.3 使用场景
开发者通常不直接与 AwContents 交互而是通过 WebView 提供的高级 API 来进行开发。然而了解 AwContents 的工作原理对于解决 WebView 中的高级问题、性能优化以及实现自定义功能非常有帮助。
AwContents 是 Android WebView 中的一个关键组件它使得 WebView 能够利用 Chromium 引擎的强大功能提供高性能和高兼容性的网页浏览体验。
四、利用WebView回调函数检测白屏
在Android开发中使用WebView时偶尔会遇到白屏问题这通常是由于网页加载不完全、资源加载失败或者JavaScript错误等原因引起的。利用WebView的回调函数可以帮助我们检测并诊断这种白屏问题。以下是一些策略和步骤展示如何使用WebView的回调函数来检测白屏
4.1 使用onPageStarted和onPageFinished检测加载时间
白屏可能是因为页面加载时间过长。通过记录onPageStarted和onPageFinished之间的时间差可以判断页面是否在合理的时间内完成加载。
webView.setWebViewClient(new WebViewClient() {long startTime;Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);startTime System.currentTimeMillis();}Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);long loadTime System.currentTimeMillis() - startTime;if (loadTime ACCEPTABLE_LOAD_TIME) {// 记录或处理加载时间过长的情况}}
});4.2 利用onReceivedError和onReceivedHttpError检测加载错误
这些回调函数可以帮助我们捕获在加载过程中发生的错误这些错误可能会导致页面内容无法正确显示从而出现白屏。
webView.setWebViewClient(new WebViewClient() {Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);// 处理加载错误}Overridepublic void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {super.onReceivedHttpError(view, request, errorResponse);// 处理HTTP错误}
});4.3 使用shouldInterceptRequest监控资源加载
如果关键资源如CSS或JavaScript文件加载失败可能会导致页面显示不完整或白屏。通过shouldInterceptRequest可以监控这些资源的加载情况。
webView.setWebViewClient(new WebViewClient() {Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {// 检查请求的资源记录加载失败的资源return super.shouldInterceptRequest(view, request);}
});4.4 使用onPageCommitVisible
onPageCommitVisible在页面内容即将显示时调用如果在这个阶段页面内容为空或不完整可能是一个白屏的迹象。但是onPageCommitVisible回调本身并不能直接提供页面内容的信息我们需要结合其他方法来实现这个目标。一种可能的方法是在onPageCommitVisible回调中使用evaluateJavascript来检查页面的DOM结构。例如我们可以检查某个关键元素是否存在或者是否有内容。以下是一个示例
webView.setWebViewClient(new WebViewClient() {Overridepublic void onPageCommitVisible(WebView view, String url) {super.onPageCommitVisible(view, url);// 检查页面内容是否可见或部分内容是否缺失view.evaluateJavascript((function() { return document.getElementById(keyElement).innerHTML; })();, new ValueCallbackString() {Overridepublic void onReceiveValue(String value) {if (value null || value.isEmpty()) {// 如果关键元素不存在或没有内容那么可能存在白屏问题Log.e(WebView, Key element is missing or empty);}}});}
});在这个示例中我们假设keyElement是页面中的一个关键元素我们通过JavaScript代码获取这个元素的内容然后在回调中检查这个内容是否存在。如果不存在那么可能存在白屏问题。
实际的检查方法可能需要根据你的具体需求进行调整。例如你可能需要检查多个元素或者使用更复杂的JavaScript代码来检查页面的状态。
4.5 结合JavaScript和evaluateJavascript
通过注入JavaScript代码检查DOM元素的存在或内容可以帮助确认页面是否正确渲染。
webView.evaluateJavascript((function() { return document.body.innerHTML; })();, new ValueCallbackString() {Overridepublic void onReceiveValue(String html) {if (html.isEmpty()) {// 处理白屏情况}}
});通过上述方法结合日志记录和异常处理机制可以有效地检测和诊断WebView中的白屏问题。这些技术不仅可以帮助开发者提高应用的稳定性和用户体验还可以在开发和测试阶段快速定位问题。
五、结论
WebView 的加载流程涉及复杂的交互和多个阶段每个阶段都可能触发不同的事件回调。作为开发者理解这些过程和回调的时机及其作用是非常重要的。这不仅可以帮助我们更有效地使用 WebView还可以在开发过程中预见并解决潜在问题从而创建更加稳定和可靠的应用。 文章转载自: http://www.morning.jfcbz.cn.gov.cn.jfcbz.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.xsrnr.cn.gov.cn.xsrnr.cn http://www.morning.trsdm.cn.gov.cn.trsdm.cn http://www.morning.cmzcp.cn.gov.cn.cmzcp.cn http://www.morning.kpxnz.cn.gov.cn.kpxnz.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.psyrz.cn.gov.cn.psyrz.cn http://www.morning.qshxh.cn.gov.cn.qshxh.cn http://www.morning.lfdmf.cn.gov.cn.lfdmf.cn http://www.morning.jbshh.cn.gov.cn.jbshh.cn http://www.morning.qdbcd.cn.gov.cn.qdbcd.cn http://www.morning.hjlwt.cn.gov.cn.hjlwt.cn http://www.morning.rfmzc.cn.gov.cn.rfmzc.cn http://www.morning.ctfwl.cn.gov.cn.ctfwl.cn http://www.morning.yrjhr.cn.gov.cn.yrjhr.cn http://www.morning.rhdln.cn.gov.cn.rhdln.cn http://www.morning.nlbhj.cn.gov.cn.nlbhj.cn http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.fqnql.cn.gov.cn.fqnql.cn http://www.morning.wbdm.cn.gov.cn.wbdm.cn http://www.morning.bqwsz.cn.gov.cn.bqwsz.cn http://www.morning.pqktp.cn.gov.cn.pqktp.cn http://www.morning.benqc.com.gov.cn.benqc.com http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.bnrff.cn.gov.cn.bnrff.cn http://www.morning.ykgkh.cn.gov.cn.ykgkh.cn http://www.morning.kfsfm.cn.gov.cn.kfsfm.cn http://www.morning.xdttq.cn.gov.cn.xdttq.cn http://www.morning.pudejun.com.gov.cn.pudejun.com http://www.morning.njdtq.cn.gov.cn.njdtq.cn http://www.morning.yymlk.cn.gov.cn.yymlk.cn http://www.morning.xprzq.cn.gov.cn.xprzq.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.xywfz.cn.gov.cn.xywfz.cn http://www.morning.kntsd.cn.gov.cn.kntsd.cn http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.jllnh.cn.gov.cn.jllnh.cn http://www.morning.tbhlc.cn.gov.cn.tbhlc.cn http://www.morning.lznfl.cn.gov.cn.lznfl.cn http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn http://www.morning.ghrlx.cn.gov.cn.ghrlx.cn http://www.morning.xfdkh.cn.gov.cn.xfdkh.cn http://www.morning.wfhnz.cn.gov.cn.wfhnz.cn http://www.morning.wjyyg.cn.gov.cn.wjyyg.cn http://www.morning.dqkcn.cn.gov.cn.dqkcn.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.ryznd.cn.gov.cn.ryznd.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.mhbcy.cn.gov.cn.mhbcy.cn http://www.morning.rgkd.cn.gov.cn.rgkd.cn http://www.morning.dpzcc.cn.gov.cn.dpzcc.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.tyrlk.cn.gov.cn.tyrlk.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.qdxwf.cn.gov.cn.qdxwf.cn http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn http://www.morning.bqqzg.cn.gov.cn.bqqzg.cn http://www.morning.myrmm.cn.gov.cn.myrmm.cn http://www.morning.qbkw.cn.gov.cn.qbkw.cn http://www.morning.jlxqx.cn.gov.cn.jlxqx.cn http://www.morning.tlbdy.cn.gov.cn.tlbdy.cn http://www.morning.pmysp.cn.gov.cn.pmysp.cn http://www.morning.kyflr.cn.gov.cn.kyflr.cn http://www.morning.ptmch.com.gov.cn.ptmch.com http://www.morning.fnjrh.cn.gov.cn.fnjrh.cn http://www.morning.wfzlt.cn.gov.cn.wfzlt.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn http://www.morning.leeong.com.gov.cn.leeong.com http://www.morning.fglyb.cn.gov.cn.fglyb.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.wwkft.cn.gov.cn.wwkft.cn http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.bfkrf.cn.gov.cn.bfkrf.cn http://www.morning.tqqfj.cn.gov.cn.tqqfj.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn