文档章节

Android WebView

CrazyManDF
 CrazyManDF
发布于 2017/05/07 09:28
字数 580
阅读 127
收藏 1

WebView内存泄漏

private void initView() {

        LinearLayout llRoot = findViewById(R.id.ll_root);

        wvShow = new WebView(getApplicationContext());
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        wvShow.setBackgroundColor(ContextCompat.getColor(this, R.color.white));
        llRoot.addView(wvShow,params);
    }

    private void setupView() {
        WebSettings settings = wvShow.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setAllowUniversalAccessFromFileURLs(true);
        settings.setDefaultTextEncodingName("utf-8");
        String url = "";
        wvShow.loadUrl(url);
    }

    @Override
    protected void onDestroy() {
        if (wvShow != null) {
            ViewParent viewParent = wvShow.getParent();
            if (viewParent != null){
                ((ViewGroup)viewParent).removeView(wvShow);
            }
            wvShow.stopLoading();
            wvShow.getSettings().setJavaScriptEnabled(false);
            wvShow.clearHistory();
            wvShow.removeAllViews();
            wvShow.destroy();
        }
        super.onDestroy();
    }

https://www.jianshu.com/p/3e8f7dbb0dc7

解决跨域的问题

报错:XMLHttpRequest cannot load http://www.xx.com/xx. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'null' is therefore not allowed access."

Android端:

WebSettings settings = wvShow.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowUniversalAccessFromFileURLs(true);  // 跨域
settings.setDefaultTextEncodingName("utf-8");
wvShow.loadUrl("http://www.xx.com/");

ajax请求


$.ajax({
	url : path,
	type: "POST",
	crossDomain: true, // 跨域配置
	xhrFields: {
		withCredentials: true //发送凭据
	},
	success : function(result) {
	   alert("success");
	}
});

php 允许所有域名访问

header('Access-Control-Allow-Origin:*'); //跨域访问
header("Access-Control-Allow-Credentials: true"); //允许跨域请求中携带cookie	

// 服务器端 Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin 的值不能为 '*'

参考:

webview跨域问题解决方案 http://blog.csdn.net/yclfdn2004/article/details/51364660

跨域Ajax请求时是否带Cookie的设置 http://blog.csdn.net/wzl002/article/details/51441704

前后端分离的web项目,ajax跨域请求后端携带cookie https://my.oschina.net/qinghang/blog/1608792

http://blog.hellofe.com/web/2014/12/28/the-CORS-protocol/

Android WebView获取网页数据

/**
 * webview加载网页url
 */
private void LoadAuthPageUrl() {

	String url = "xxxxxx";

	wbAuth.setWebChromeClient(new WebChromeClient(){

		[@Override](https://my.oschina.net/u/1162528)
		public void onReceivedTitle(WebView view, String title) {
			super.onReceivedTitle(view, title);
			Log.d(TAG, "==" + title);
		}
	});
	wbAuth.setWebViewClient(new WebViewClient(){

		[@Override](https://my.oschina.net/u/1162528)
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			view.loadUrl("javascript:(function() { " + jsFormInjectCode + "})()"); //注入javascript
		}

		[@Override](https://my.oschina.net/u/1162528)
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url); 
			return true;
		}

		[@Override](https://my.oschina.net/u/1162528)
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			super.onReceivedError(view, errorCode, description, failingUrl);
			Log.d(TAG, "==" +errorCode + "=" + description + "=" +failingUrl);
		}
	});
	// 将FormDataInterface类中的processFormData方法映射到javascript中的window.FORMOUT.processFormData(data);
	wbAuth.addJavascriptInterface(new FormDataInterface(), "FORMOUT"); 
	WebSettings settings = wbAuth.getSettings();
	settings.setJavaScriptEnabled(true);  // 支持javascript
	settings.setDefaultTextEncodingName("utf-8");
	wbAuth.loadUrl(url); // 加载网页url
	//wbAuth.loadDataWithBaseURL(url, data,  "text/html", "utf-8", null); // 直接加载html字符串,第一个url是html种资源获取的根路径
}


 /**
 * javascript的交互类
 */
private class FormDataInterface {

	@JavascriptInterface
	public void processFormData(String formData) {
		// 获取到的值:
		// method=post&action=xx&response_type=code&redirect_uri=xxx&username=xxx&password=xxx
		Log.d(TAG, "====" + formData);
		
	}

}

// 注入的javascript代码

String jsFormInjectCode =
	"function parseForm(event) {" +
	" var form = this;" +
	" if (this.tagName.toLowerCase() != 'form')" +
	"   form = this.form;" +
	" var data = '';" +
	" if (!form.method) form.method = 'get';" +
	" data += 'method=' + form.method;" +
	" data += '&action=' + form.action;" +
	" var inputs = document.forms[0].getElementsByTagName('input');" +
	" for (var i = 0; i < inputs.length; i++) {" +
	"   var field = inputs[i];" +
	"   if (field.type != 'submit' && field.type != 'reset' && field.type != 'button')" +
	"       data += '&' + field.name + '=' + field.value;" +
	" }" +
	" window.FORMOUT.processFormData(data);" +
	"}" +
	"" +
	"for (var form_idx = 0; form_idx < document.forms.length; ++form_idx)" +
	"       document.forms[form_idx].addEventListener('submit', parseForm, false);" +
	"var inputs = document.getElementsByTagName('input');" +
	"for (var i = 0; i < inputs.length; i++) {" +
	"       if (inputs[i].getAttribute('type') == 'button')" +
	"           inputs[i].addEventListener('click', parseForm, false);" +
	"}";

[参照]https://gist.github.com/adrobisch/734117

© 著作权归作者所有

共有 人打赏支持
CrazyManDF
粉丝 3
博文 78
码字总数 30987
作品 0
程序员
私信 提问
如何获取WebView的内容宽度[翻译]

原文网址:http://android.pimmos.com/2011/03/24/how-to-retrieve-the-contentwidth-of-a-webview/ The extensive Android SDK allows you to do many great things with particular views ......

拉风的道长
2013/04/23
0
5
Android 想做一个 android 登录功能,并且保持登录状态直至用户注销

android小白,现在做一个东西,android activity包裹webview。现在想实现一个登录功能。在欢迎页面的时候判断是否登录过,如果登录过就跳到webview。如果没登录过就跳到另一个activity去登录...

奈萌摸尔
2015/01/26
3.6K
2
WebView 设置背景透明

WebView 在 xml 发现,最后背景还不透明,但在代码里 webview = (WebView) findViewById(R.id.webView); // webview.setBackgroundColor(0); 背景就透明了~!2.3 htc 和4.0 xiaomi2s都试过了...

marktola
2013/10/17
2.2K
2
Android UI开发之WebView简单使用

If you want to deliver a web application (or just a web page) as a part of a client application, you can do it using WebView. The WebView class is an extension of Android's View......

秋风醉了
2014/06/17
0
0
Android的WebView与ProgressDialog结合

WebView组件支持直接加载网页,可以将其视为一个浏览器,要实现该功能,具体步骤如下: webview.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:o...

墙头草
2011/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

oh-my-zsh 自定义

GitHub 地址 基于 oh-my-zsh 的自定义配置,增加了一些个人常用插件与皮肤。 采用的是 git submodule 来维护,包括 oh-my-zsh,之所以这么搞,主要是手头有多台 linux 需要维护, 每台机器、...

郁也风
9分钟前
1
0
Docker安装踩坑:E_FAIL 0x80004005的解决

参考 菜鸟教程--Windows Docker 安装 http://www.runoob.com/docker/windows-docker-install.html 官方文档-Install Docker Toolbox on Windows https://docs.docker.com/toolbox/toolbox_in......

karma123
35分钟前
4
0
js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部