android那些事--WebView拦截使用
来源:互联网 发布:淘宝女装代销货源 编辑:程序博客网 时间:2024/04/30 05:56
看了篇webview拦截的用法,记录一下
WebView最简单的用法就是loadUrl方法.
常用代码如下.
demoWv = ((WebView) findViewById(R.id.demoWv)); WebSettings settings = demoWv.getSettings();// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true settings.setJavaScriptEnabled(true); demoWv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {// 是否使用第三方浏览器 返回true不调用 返回false调用 return true; } }); demoWv.loadUrl("https://www.baidu.com");
WebView拦截请求
WebView调用loadUrl后,会首先根据传入URL获取响应,然后再将响应显示到页面上,这就是WebView的原理.根据这个原理,那么我们可以在获取响应过程中重新改变请求URL或者直接将响应替换.
而具体的替换在WebViewClient的:
WebResourceResponse shouldInterceptRequest(WebView view,WebResourceRequest request)
这个方法中,该方法用于根据请求去获取响应,如果返回null,那么android会根据请求去获取响应并返回,但是如果你重写了该方法并返回了响应,那么WebView就会使用你的响应数据.其中WebResourceRequest封装了请求,WebResourceResponse封装了响应.
使用静态响应
既然知道了原理,就可以写个demo测试一下
demoWv = ((WebView) findViewById(R.id.demoWv)); WebSettings settings = demoWv.getSettings();// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true settings.setJavaScriptEnabled(true); demoWv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {// 是否使用第三方浏览器 返回true不调用 返回false调用 return true; } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String result = "<html>\n" + "<title>千度</title>\n" + "<body>\n" + "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" + "</body>\n" + "<html>"; WebResourceResponse response = new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(result.getBytes())); return response; } }); demoWv.loadUrl("https://www.baidu.com");
使用网络资源响应
shouldInterceptRequest方法API还有介绍,该方法是在非UI线程中,所以当需要与View系统交互时需要小心.既然时非UI线程中,那么我们可以放在其中做网络请求.比如可以可以去www.importnew.com
的响应数据,将百度替换为importnew.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); demoWv = ((WebView) findViewById(R.id.demoWv)); WebSettings settings = demoWv.getSettings();// 网页中含有JavaScript脚本时,需要调用以下方法,参数为true settings.setJavaScriptEnabled(true); demoWv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {// 是否使用第三方浏览器 返回true不调用 返回false调用 return true; } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return getWebRes(); } }); demoWv.loadUrl("https://www.baidu.com"); } private WebResourceResponse getWebRes() { StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try { URL url = new URL("http://www.importnew.com/"); HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection();// 连接主机超时时间 httpURLConnection.setConnectTimeout(10 * 1000);// 设置从主机读取数据超时 httpURLConnection.setReadTimeout(40 * 1000); bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection .getInputStream())); String line = ""; while ((line = bufferedReader.readLine()) != null) { stringBuilder.append(line); } } catch (Exception e) { e.printStackTrace(); }finally { if (bufferedReader!=null){ try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } WebResourceResponse webResourceResponse = null; webResourceResponse=new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream(stringBuilder.toString().getBytes())); return webResourceResponse; }
注意:WebView中调用的每个请求都会经过那个拦截器,所以如果一个页面中又有超链接,那么依然会经过那么拦截器.所以上面的Importnew中有些图片没有加载出来.因为是以文本形式响应的,并且是以utf-8做为编码的,所以有时候会出现乱码.
应用
在实际应用中,最好时先判断要加载的URL是否需要拦截,如果不是的话,可以以然交给WebView去实现.
0 0
- android那些事--WebView拦截使用
- Android WebView 那些事
- Android之使用WebView的那些事儿
- android webview拦截超链接
- android-WebView拦截JavaScript
- Android webView拦截url
- Android webView拦截url
- Android webview中拦截超链接
- android webview 页面加载拦截
- Android的WebView拦截数据
- android WebView拦截请求详解
- Android WebView拦截请求详解
- Android Webview拦截ajax请求
- Android中WebView拦截js请求
- android webview点击拦截事件处理判断
- WebView--- Android WebView使用总结
- 关于WebView的那些事
- android webview一篇文章全面了解(基本使用,url拦截,js跟java交互)
- linux中的线程函数
- (转载)core dump的使用
- MySQL的备份和还原
- Java String字符串处理和字符处理
- 写在noip2016前的一些话
- android那些事--WebView拦截使用
- Kattis A+B Problem(FFT,计数)
- Linxu网络编程——myp2p-qq
- Ajax较复杂实例
- Oracle数据库 —— SQL之select语句(2) where子句和数据排序
- 【NOIP2014】Day1T2 联合权值
- Spark Streaming与Kafka集成编程
- Wunderlist使用技巧
- 单例模式