【WebView】Android WebView专栏——基本使用及常见问题

WebView常用方法及常见问题总结:

● load数据的三种方式

loadUrl(String url)

使用url地址加载数据,如果是保存在本地的assets文件夹中,使用样式为:

webView.loadUrl("file:///android_asset/example.html");

loadData(String data, String mimeType, String encoding)

使用网页内容加载数据,使用样式为:

webView.loadData(htmlContent, "text/html", Encoding.UTF_8.name());

注意:使用loadData方法经常会出现乱码的情况,因为WebView默认编码是“Latin-1”,通过mWebView.getSettings().getDefaultTextEncodingName()语句可以查看,所以需要设置WebView对象的编码格式为UTF_8:

mWebView.getSettings().setDefaultTextEncodingName("utf-8");  
或者直接使用loadDataWithBaseURL方法。

loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

使用网页内容加载数据,使用样式为:

webView.loadDataWithBaseURL(null, htmlContent, "text/html", Encoding.UTF_8.name(), null);

扩展:如果url只是一个图片或者视频,正常情况下,loadUrl方法是无法展示的,但是可以通过loadDataWithBaseURL方法展示,具体操作如下:

String body ="";
mWebView.loadDataWithBaseURL("http://www.jcodecraeer.com", body, "text/html", "utf-8",null);

当然,标签的src属性值也可以直接使用图片或者视频的完整地址。


● setWebViewClient

使用WebView加载网页,避免打开浏览器

如果不为WebView设置WebViewClient的话,系统会使用手机默认浏览器打开为其设置的url链接,相反,如果设置了WebViewClient并且重写了WebViewClient的 shouldOverrideUrlLoading(WebView view, final String url)的方法,即可避免上述问题。

		WebSettings webSettings = mContentWv.getSettings();
		webSettings.setDomStorageEnabled(true);
		webSettings.setJavaScriptEnabled(true);
		
		mContentWv.setWebViewClient(new WebViewClient(){
			
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				return false;
			}
		});

参考源码中对shouldOverrideUrlLoading(WebView view, final String url)的解释:

Give the host application a chance to take over the control when a new url is about to be loaded in the current WebView. If WebViewClient is not provided, by default WebView will ask Activity Manager to choose the proper handler for the url. If WebViewClient is provided, return true means the host application handles the url, while return false means the current WebView handles the url. This method is not called for requests using the POST "method".

onReceivedError方法

onReceivedError方法能够接受网络错误:

	@Override
	public void onReceivedError(WebView view, int errorCode,
		String description, String failingUrl) {
		//用javascript隐藏系统定义的错误提示页面
		String data = "Network Error!";
		view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
	}	

而网上大多数的处理方式是view.loadUrl(指向一个assets目录下的html文件或者"about:blank"),这样处理的话,在重新刷新时就会刷新当前这个错误的页面,或者在处理goBack()时候会出现一些问题。而通过以上方式则可以避免相应的问题。

注意:

onReceivedError方法无法处理经典的404错误,其实想想也是,404也是服务器响应具体解决办法求解中。。。



● setDomStorageEnabled

WebView数据缓存分为两种:AppCache和DOM Storage(Web Storage)。他们是因为Web页面开发者的直接行为而产生。

如果Web页面中使用到了Dom缓存,需要在代码中设置:

webSettings.setDomStorageEnabled(true);

否则, 将会导致web页面加载不出,而现实一片空白,控制台会打印:Uncaught TypeError: Cannot call method 'getItem' of null"之类的异常信息!

● destroy()方法

使用WebView浏览一些含有音频、视频信息的网页时,需要在所属Activity的生命周期中添加WebView的onPause()、onResume()以及destroy()方法,否则,当WebView所属Activity销毁时,web页面中的音视频不会停止播放。

补充:HTML5 标签audio添加网页背景音乐代码

● Url重定向导致goBack失效的问题

正常情况下,使用手机返回键,将会关闭WebView所属的Activity界面,而不会考虑到WebView里面的网页跳转,面对这种情况,我们会使用WebView的goBack()方法,如:

	@Override
	public void onBackPressed() {
		super.onBackPressed();
		if (mActivityWv.canGoBack()) {
			mActivityWv.goBack();
		}
	}
但是如果WebView加载的url链接发生了重定向行为,比如load的是B网页,但是B网页重定向到C网页,此时调用goBack,返回到B网页,B网页又重定向到C网页,如此循环,导致无法返回到B之前的网页或者无法通过返回键结束WebView所述的Activity。

总结如下,解决办法有三种:

1. 与前端开发人员沟通,让其修改网页源码,避免使用到重定向方法;

2. 自己在代码中使用ArrayList保存url链接,建立一个WebView的历史栈,过滤重定向跳转:

这里就涉及到一个问题,如何判定url是否发生重定向?

根据标准的http协议,30开头的状态码表示重定向(如果服务器自己定义了一套状态码,则无法判断),所以,需要在WebView每次loadUrl之前,先用HttpUrlConnection对象的getResponseCode()方法来获取状态码。

3. 使用WebView.copyBackForwardList()获取历史栈,指定url的格式过滤(需要和前端人员沟通,定义重定向url格式)。


● 设置缩放以及屏幕适配

// 设置可以支持缩放 
web.getSettings().setSupportZoom(true); 
// 设置出现缩放工具 
web.getSettings().setBuiltInZoomControls(true);

为避免出现WebView在宽度上显示不全出现水平滚动的情况,可以设置WebView自适应屏幕:

web.getSettings().setUseWideViewPort(true);
web.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
这样,就算网页源码中没有含有viewport缩放的meta标签,也能使WebView在宽度上达到自使用的效果。


常用的meta标签内容如下:

1、width : 控制viewport的大小,可以指定一个值,如600, 或者特殊的值,如device-width为设备的宽度(单位为缩放为100%的CSS的像素)


2、height : 和width相对应,指定高度


3、initial-scale : 初始缩放比例,页面第一次加载时的缩放比例


4、maximum-scale : 允许用户缩放到的最大比例,范围从0到10.0


5、minimum-scale : 允许用户缩放到的最小比例,范围从0到10.0


6、user-scalable : 用户是否可以手动缩放,值可以是:①yes、 true允许用户缩放;②no、false不允许用户缩放


● 网页加载速度优化

参考地址: http://hunankeda110.iteye.com/blog/1807649


参考文章:

android WebView全面总结




你可能感兴趣的:(【Android,应用开发】)