webview的简单总结(最近面试遇到好多这方面的问题)

2024-01-12 03:18

本文主要是介绍webview的简单总结(最近面试遇到好多这方面的问题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Android中有WebView Widget,它内置了WebKit引擎,同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它的。所以很多表现WebView和Chrome是一样的。


         在使用WebView之前,要在AndroidManifest.xml中添加 如下权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

否则会出Web page not available错误。


         1 . 加载网页

              网络用:webView.loadUrl("http://www.baidu.com");
              本地文件用:webView.loadUrl(file:///android_asset/XXX.html);这里的格式是固定的,文件位置 assets目录下

              webview.postUrl(String url, byte[] postData) 加载页面使用Post方式,postData为参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //    post方式传送参数  
  2. //    String postData = "clientID = cid & username = name";  
  3. //    webview.postUrl(url, EncodingUtils.getBytes(postData, "base64"));  


         2. 使用loadData方法来加载html数据

              loadData()需要三个参数: HTML TAG ,MIME类型(text/html), 网页编码方式(utf-8).


          使用它时可能会发现有如下问题:

          I.  loadData不能加载图片内容,如果要加载图片内容或者获得更强大的Web支持请使用loadDataWithBaseURL。


          II .使用loadData方法显示乱码。那是因为编码器设置错误导致的。我们知道String类型的数据主要是unicode编码,而WebView一般为了节省资源使用的是UTF-8编码,所以我们在loadData的时候要告诉方法怎样转码。即要告诉它要将unicode编码的内容转成UTF-8编码的内容。有些朋友虽然在loadData的时候设置了编码方式,但是还是显示乱码,这是因为还需要为WebView的text编码指定编码方式.


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. WebView wv = (WebView)findViewById(R.id.webview) ;  
  2.   
  3. String content = getUnicodeContent() ;  
  4.   
  5. wv.getSettings().setDefaultTextEncodingName(“UTF -8”) ;  
  6.   
  7. wv.loadData(content, “text/html”, “UTF-8”) ;  



          WebView默认是不支持JavaScript 、IFrame或者是任何的框架语法的。通过设webview.getSettings().setJavaScriptEnabled(true);  就可以打开JavaScript.  webView.requestFocus()如果不设置的话,会出现不能弹出软键盘等问题。


          3.   setScrollBarStyle 设置滚动条风格

          webview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);在内容显示内部显示


          4.  ClearCache  清除缓存内容


          5.  goBcak canGoBack goForward canGoForward


          6.  webView.stopLoading()停止加载页面


         7.  WebViewClient 和 WebChromeClient 区别

         WebView主要负责解析渲染,WebViewClient 和WebChromeClient是用来辅助WebView。


         WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:

         onLoadResource
         onPageStart
         onPageFinish
         onReceiveError

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //受到错误时触发,比如400错误,这些错误一般都是无法补救的,最多给出提示信息  
  2.     @Override  
  3.     public void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {  
  4.         // TODO Auto-generated method stub  
  5.         super.onReceivedError(view, errorCode, description, failingUrl);  
  6.     }  


         onReceivedHttpAuthRequest


         WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如

         onCloseWindow(关闭WebView)
         onCreateWindow()
         onJsAlert (WebView上alert,Prompt,Confirm无效,需要定制WebChromeClient处理弹出,从而获取网页中的JS,比如使用AlertDialog进行显示),可以参考 http://618119.com/archives/2010/12/20/199.html

         onJsPrompt
         onJsConfirm
         onProgressChanged
         onReceivedIcon
         onReceivedTitle
         看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。更多的时候,你可以这样


          WebView webView;
          webView= (WebView) findViewById(R.id.webview);
          webView.setWebChromeClient(new WebChromeClient());
          webView.setWebViewClient(new WebViewClient());//.希望点击链接继续在当前browser中响应,必须覆盖 WebViewClient对象。
          webView.getSettings().setJavaScriptEnabled(true);
          webView.loadUrl(url);
          这样你的WebView理论上就能有大部分需要实现的特色了。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.         webview.setWebChromeClient(new MyWebChromeClient());  
  2.           
  3.         webview.setWebViewClient(new WebViewClient()  
  4.         {  
  5.             @Override  
  6.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  7.                 // TODO Auto-generated method stub  
  8. //              return super.shouldOverrideUrlLoading(view, url);  
  9.                 view.loadUrl(url);  
  10.                 return true;  
  11.             }  
  12.             @Override  
  13.             public void onPageStarted(WebView view, String url, Bitmap favicon) {  
  14.                 // TODO Auto-generated method stub  
  15.                 super.onPageStarted(view, url, favicon);  
  16.                 mProgressDialog.show();  
  17.             }  
  18.             @Override  
  19.             public void onPageFinished(WebView view, String url) {  
  20.                 // TODO Auto-generated method stub  
  21.                 super.onPageFinished(view, url);  
  22.                 mProgressDialog.hide();  
  23.             }  
  24.               
  25.         });  


 

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private class MyWebChromeClient extends WebChromeClient  
  2.     {  
  3.         @Override  
  4.         public void onReceivedTitle(WebView view, String title) {  
  5.             // TODO Auto-generated method stub  
  6.             super.onReceivedTitle(view, title);  
  7.             textview.setText(title);  
  8.         }  
  9.         }  
     

            8.   JS使用

          webview.addJavascriptInterface(new JavaScriptInterfaceDemo( this ), "JSInterfaceDemo");

          //JSInterfaceDemo其实就是JavaScriptInterfaceDemo的别名,供HTML调用时使用


         addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName,比如说JSInterfaceDemo,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.JSInterfaceDemo访问到绑定的java对象了。在HTML中如何调用呢,"window.JSInterfaceDemo.getResposeCode() " 其中getResposeCode需要在JavaScriptInterfaceDemo中实现


         需要注意的是:addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class JavaScriptInterfaceDemo  
  2. {  
  3.       
  4.     public void getResposeCode(final String msg)  
  5.     {  
  6.         mHandler.post(new Runnable()   
  7.         {  
  8.               
  9.             @Override  
  10.             public void run() {  
  11.                 // TODO Auto-generated method stub  
  12.                          }  
  13.           
  14.       
  15.           
  16.     }  
  17. }  

这篇关于webview的简单总结(最近面试遇到好多这方面的问题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596636

相关文章

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作