Android WebView 在开发过程中有哪些坑
发布时间:2025-05-18 19:58:23 发布人:远客网络
一、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:根据需要实现的功能从而使用相应的子类及其方法(注释很清楚了)