您当前的位置:首页 > 互联网教程

Android WebView 在开发过程中有哪些坑

发布时间:2025-05-18 19:58:23    发布人:远客网络

Android WebView 在开发过程中有哪些坑

一、Android WebView 在开发过程中有哪些坑

自Android 4.4起,引入了webView,使用需要注意的事项:

如果你在子线程中调用WebView的相关方法,而不在UI线程,则可能会出现无法预料的错误。

所以,当你的程序中需要用到多线程时候,也请使用 runOnUiThread()方法来保证你关于WebView的操作是在UI线程中进行的:

永远不要阻塞UI线程,这是开发Android程序的一个真理。虽然是真理,我们却往往不自觉的犯一些错误违背它,一个开发中常犯的错误就是:在UI线程中去等待JavaScript的回调。

// This code is BAD and will block the UI thread

webView.loadUrl("javascript:fn()"); while(result==null){

千万不要这样做,Android 4.4中,提供了新的Api来做这件事情。 evaluateJavascript()就是专门来异步执行JavaScript代码的。

专门用于异步调用JavaScript方法,并且能够得到一个回调结果。

mWebView.evaluateJavascript(script, new ValueCallback<String>(){

public void onReceiveValue(String value){

新版WebView对于自定义scheme的url跳转,新增了更为严格的限制条件。当你实现了 shouldOverrideUrlLoading()或 shouldInterceptRequest()回调,WebView也只会在跳转url是合法Url时才会跳转。

<ahref="showProfile"]]>Show Profile</a>

shouldOverrideUrlLoading()将不会被调用。

<ahref="example-app:showProfile"]]>Show Profile</a>

// The URL scheme should be non-hierarchical(no trailing slashes)

privatestaticfinalString APP_SCHEME="example-app:";

@Override publicboolean shouldOverrideUrlLoading(WebView view,String

if(url.startsWith(APP_SCHEME)){

urlData=URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,

如果你的App对应的服务端程序,会根据客户端传来的UserAgent来做不同的事情,那么你需要注意的是,新版本的WebView中,UserAgent有了些微妙的改变:

Mozilla/5.0(Linux; Android 4.4; Nexus 4 Build/KRT16H)

AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0

使用 getDefaultUserAgent()方法可以获取默认的UserAgent,也可以通过:

mWebView.getSettings().setUserAgentString(ua);

mWebView.getSettings().getUserAgentString();

来设置和获取自定义的UserAgent。

6.使用addJavascriptInterface()的注意事项

从Android4.2开始。只有添加@JavascriptInterface声明的Java方法才可以被JavaScript调用,例如:

public String toString(){ return"injectedObject";}

webView.addJavascriptInterface(new JsObject(),"injectedObject");

webView.loadData("","text/html", null);

webView.loadUrl("javascript:alert(injectedObject.toString())");

新版的WebView还提供了一个很厉害的功能:使用Chrome来调试你运行在WebView中的程序。

二、android webview是什么

这是安卓系统内置webkit内核浏览器的一个组件,组件名称为Webview。

WebView是安卓系统中一款基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,在版本更新到4.4后直接使用了Chrome版本。

WebView能够对Web页面进行i显示和渲染,可以直接使用html文件(网络上或本地assets中)作布局,更可以可和JavaScript交互调用。

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

总的来说,webView是用于展示网络请求后的结果,比如:开发者开发一款APP,如果想要用它访问网络,但是不想使用手机安装的浏览器,而是想在自己APP内部打开展示网页,此时就可以使用webView这个组件来展示网页。

WebView组件使用的WebKit引擎。默认情况下,WebView不支持JavaScript,web页面的错误也会被忽略,如果只是用Webview来显示网页而不用交互,默认配置就可以了。如果需要交互,就需要自定义配置了。

webView.loadUrl("");

WebView加载assets目录下的本地网页语法格式:

webView.loadUrl("");

WebView加载手机本地网页语法格式:

webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

WebView加载HTML代码片段语法格式:

webView.loadData(data,"text/html","utf-8");

webView.loadDataWithBaseURL(null, data,"text/html","utf-8", null);

参考资料来源:百度百科-webkit之WebView

三、Android:最全面的 Webview 详解

WebView是一个基于webkit引擎、展现web页面的控件。

一般来说Webview可单独使用,可联合其子类一起使用,所以接下来,我会介绍:

配置步骤1:添加访问网络权限(AndroidManifest.xml)

配置步骤2:生成一个WebView组件(有两种方式)

配置步骤3:进行配置-利用WebSettings子类(常见方法)

注意:每个 Application只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()

常见方法1:shouldOverrideUrlLoading()

常见方法5:onReceivedError()

常见方法6:onReceivedSslError()

常见方法1: onProgressChanged()

常见方法2: onReceivedTitle()

具体请看我写的文章 Android WebView与JS的交互方式最全面汇总

3.4.1不在xml中定义 Webview,而是在需要的时候在Activity中创建,并且Context使用 getApplicationgContext()

3.4.2在 Activity销毁( WebView)的时候,先让 WebView加载null内容,然后移除 WebView,再销毁 WebView,最后置空。

步骤3:根据需要实现的功能从而使用相应的子类及其方法(注释很清楚了)