首页 > 其他分享 >android webview 使用以及一些常见的异常处理

android webview 使用以及一些常见的异常处理

时间:2023-06-04 18:36:11浏览次数:37  
标签:url 常见 mWebView public WebView android true webview view


android中的提供webview控件,可以方便开发人员是自己的应用嵌入网页浏览功能,但实际开发中却会遇到一些问题,这个稍后会介绍到,

效果图:

 

先来看个实例:

 



1. public class MainActivity extends Activity {  
2. final String COMPANY_WEB=;  
3. private WebView mWebView;  
4.   
5. @Override  
6. protected void onCreate(Bundle savedInstanceState) {  
7. super.onCreate(savedInstanceState);  
8.         setContentView(R.layout.activity_main);  
9.         mWebView = (WebView) findViewById(R.id.webview);  
10.         setWebView();  
11.           
12.     }  
13.   
14. private void setWebView(){  
15.         WebSettings webSettings = mWebView.getSettings();  
16. true);    
17. true);    
18. true);    
19. true);  
20.           
21. new MonitorWebClient());  
22.           
23.         mWebView.loadUrl(COMPANY_WEB);  
24.     }  
25.       
26. private class MonitorWebClient extends WebViewClient{  
27.   
28. @Override  
29. public void onPageStarted(WebView view, String url, Bitmap favicon) {  
30.               
31. super.onPageStarted(view, url, favicon);  
32.         }  
33.           
34. @Override  
35. public void onPageFinished(WebView view, String url) {  
36.               
37. super.onPageFinished(view, url);  
38.         }  
39.   
40. @Override  
41. public boolean shouldOverrideUrlLoading(WebView view, final String url) {  
42.             String website=Uri.parse(url).getHost();  
43.               
44. if (COMPANY_WEB.equals(website)) {  
45. // This is my web site, so do not override; let my WebView load the page  
46. return false;  
47. else{  
48.                  view.loadUrl(url);            
49. return true;   
50.              }  
51. //  return super.shouldOverrideUrlLoading(view, url);  
52.         }  
53.     }  
54.       
55. @Override  
56. public boolean onKeyDown(int keyCode, KeyEvent event)  
57.     {  
58. if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())  
59.         {  
60.             mWebView.goBack();  
61. return true;  
62.         }  
63. return super.onKeyDown(keyCode, event);  
64.     }  
65.       
66. }


 

 

相关权限:

 


1. <uses-permission android:name="android.permission.INTERNET" />  
2. "android.permission.ACCESS_NETWORK_STATE" />  
3. "android.permission.ACCESS_WIFI_STATE" />


 

 

ok,测试了一下相关链接也可以出现正常访问,以上是以csdn网站为例,如果将网站换成http://www.qq.com开始也没有问题,点击导航栏也可以正常访问,再点击图片连接就会出现 eventhub.removemessages(int what = 107) is not supported before the webviewcore is set up异常信息,有人说是没有以http://开头,这个也试了一下,没有解决问题,期待有人能解决。回过头来在首页点击相关新闻链接后会发现出现空白页无法正常访问,后来研究发现这个和网站结构有关系,看来webview并不能完全实现浏览器功能。

接下来就是简单的异常处理了,主要就是重写WebViewClient类中的onReceivedError()方法和onReceivedSslError()方法来进行处理了。

说完异常简单处理后再来说说提高网站的访问速度,尤其是带有大量的flash,swf动画和各种css样式功能,这个时候我们就应该使用缓存了,适当的设置缓存大小以及合适的模式来进行优化了,webview有两种模式可设置如下:

1,LOAD_DEFAULT,根据cache-control决定是否从网络上取数据。
2,LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
如:m.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要打开过一次,都使用缓存。
m.sina.com.cn的cache-control为max-age=60,在两种模式下都使用本地缓存数据。

总结:根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

好说的也差不多了,来看一下优化后的代码:

 





    1. public class MainActivity extends Activity {  
    2.   
    3. final String COMPANY_WEB="http://www.deczh.com/";  
    4. private WebView mWebView;  
    5. private Context activity;  
    6. //  private ProgressDialog progressDialog;  
    7. //history web site  
    8. //  private Stack<String> webHistory=new Stack<String>();  
    9.       
    10. @Override  
    11. protected void onCreate(Bundle savedInstanceState) {  
    12. super.onCreate(savedInstanceState);  
    13.         setContentView(R.layout.activity_main);  
    14.         mWebView = (WebView) findViewById(R.id.webview);  
    15.         setWebView();  
    16. this;  
    17. 0, 1000);  
    18.     }  
    19.       
    20. private void setWebView(){  
    21.         WebSettings webSettings = mWebView.getSettings();  
    22. //java script  
    23. true);    
    24. true);  
    25. // access Assets and resources  
    26. true);    
    27. //zoom page  
    28. true);    
    29. true);  
    30. //set xml dom cache  
    31. true);  
    32. //提高渲染的优先级  
    33.           webSettings.setRenderPriority(RenderPriority.HIGH);    
    34. //set cache  
    35. "netCache", Context.MODE_PRIVATE).getAbsolutePath();  
    36. true);  
    37.           webSettings.setAppCachePath(appCachePath);  
    38. 1024*1024*5);  
    39.           webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  
    40.           
    41. new MonitorWebClient());  
    42. new AppCacheWebChromeClient());  
    43.     }  
    44.       
    45. private class MonitorWebClient extends WebViewClient{  
    46.   
    47. @Override  
    48. public void onReceivedError(WebView view, int errorCode,  
    49.                 String description, String failingUrl) {  
    50. //错误提示  
    51. "Oh no! " + description,  
    52.                     Toast.LENGTH_LONG);  
    53. 0, 0);  
    54.             toast.show();  
    55. //错误<strong>处理</strong>  
    56. try {  
    57.                 mWebView.stopLoading();  
    58. catch (Exception e) {  
    59.             }  
    60. try {  
    61.                 mWebView.clearView();  
    62. catch (Exception e) {  
    63.             }  
    64. if (mWebView.canGoBack()) {  
    65.                 mWebView.goBack();  
    66.             }  
    67. //  super.onReceivedError(view, errorCode, description, failingUrl);  
    68.         }  
    69. //当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框  
    70. @Override  
    71. public void onReceivedSslError(WebView view, SslErrorHandler handler,  
    72.                 SslError error) {  
    73. //忽略证书的错误继续Load页面内容  
    74.              handler.proceed();  
    75. //handler.cancel(); // Android默认的<strong>处理</strong>方式  
    76. //handleMessage(Message msg); // 进行其他<strong>处理</strong>  
    77. //  super.onReceivedSslError(view, handler, error);  
    78.         }  
    79.   
    80. @Override  
    81. public void onPageStarted(WebView view, String url, Bitmap favicon) {  
    82. /*if (progressDialog == null) {
    83.                  // If no progress dialog, make one and set message
    84.                  progressDialog = new ProgressDialog(activity);
    85.                  progressDialog.setMessage("Loading please wait...");
    86.                  progressDialog.show();
    87.                  // Hide the webview while loading
    88.                  mWebView.setEnabled(false);
    89.              }*/  
    90.               
    91. //  super.onPageStarted(view, url, favicon);  
    92.         }  
    93.           
    94. @Override  
    95. public void onPageFinished(WebView view, String url) {  
    96. /* if (progressDialog != null&&progressDialog.isShowing()) {
    97.                 progressDialog.dismiss();
    98.                 progressDialog = null;
    99.                 mWebView.setEnabled(true);
    100.             }*/  
    101.               
    102. /*if(!webHistory.contains(url))
    103.                 webHistory.push(url);*/  
    104.               
    105. //  super.onPageFinished(view, url);  
    106.         }  
    107.   
    108. @Override  
    109. public boolean shouldOverrideUrlLoading(WebView view, final String url) {   Log.e(getClass().getSimpleName(), "website= "+url);  
    110. //  String website=Uri.parse(url).getHost();  
    111.             String processUrl=url;  
    112. if(!processUrl.startsWith("http://"))  
    113. "http://"+processUrl;  
    114.               
    115. if (COMPANY_WEB.equals(url)) {  
    116. // This is my web site, so do not override; let my WebView load the page  
    117. return false;  
    118.               }  
    119. else{  
    120.                  view.loadUrl(processUrl);            
    121. return true;   
    122.              }  
    123. //   return super.shouldOverrideUrlLoading(view, url);  
    124.         }  
    125.     }  
    126.       
    127. private class AppCacheWebChromeClient extends WebChromeClient {  
    128. @Override  
    129. public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {  
    130. //    Log.e(APP_CACHE, "onReachedMaxAppCacheSize reached, increasing space: " + spaceNeeded);  
    131. 2);  
    132.             }  
    133.         }  
    134.        
    135. private boolean pause=false;  
    136. @Override  
    137. public void onPause() {  
    138. super.onPause();  
    139. if (mWebView != null) {  
    140.             mWebView.pauseTimers();  
    141.             mWebView.onPause();  
    142. this.pause=true;  
    143.         }  
    144.     }  
    145.   
    146. @Override  
    147. public void onResume() {  
    148. super.onResume();  
    149. if (mWebView != null&&pause) {  
    150.             mWebView.resumeTimers();  
    151.             mWebView.onResume();  
    152. this.pause=false;  
    153.         }  
    154.     }  
    155.       
    156. @Override  
    157. public boolean onKeyDown(int keyCode, KeyEvent event)  
    158.     {  
    159. if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()){  
    160.             mWebView.goBack();  
    161. return true;  
    162.         }  
    163.          
    164. return super.onKeyDown(keyCode, event);  
    165.     }  
    166.       
    167.       
    168. }


    相关权限:

     

     



    1. <uses-permission android:name="android.permission.INTERNET" />  
    2. "android.permission.ACCESS_NETWORK_STATE" />  
    3. "android.permission.ACCESS_WIFI_STATE" />  
    4.   
    5. "android.permission.WRITE_EXTERNAL_STORAGE" />  
    6. "android.permission.READ_EXTERNAL_STORAGE" />


    经过代码优化后,访问速度明显提升,部分错误得到处理,但是还是会有异常处理不了,如果谁有好的错误处理方法,希望留言讨论,大家一起进步。

     

    好了就先说到这里吧!

    标签:url,常见,mWebView,public,WebView,android,true,webview,view
    From: https://blog.51cto.com/u_16120380/6411555

    相关文章

    • android布局技巧:创建高效布局
      AndroidUI工具包提供了一些布局管理器,它们使用起来相当容易,而且,大多数的时候,你只需要使用它们最基本的特征来实现UI。执着于基本特征的使用对于创建UI来说,往往不是最高效的。一个常见的例子就是滥用LinearLayout,它将会导致View树中的View数量激增。View——更糟的是,布局管理器——......
    • android与phonegap的相互交互
      开发环境:androidSDK+android2.3或以上的真机开发所需:cordova-2.1.0.js+sencha-touch-all-debug.js 首先把你的phonegap或sehcha项目放到assets文件夹下,然后在你的入口函数(onCreate)里添加如下:1.super.init();2.super.setBooleanProperty("loadInWebView",true);......
    • 绩效考核常见问题有哪些?
      绩效考核常见问题有很多,比如:绩效指标的设定不合理或不明确,导致考核结果与实际工作表现不符。绩效考核过程中缺乏有效的沟通和反馈,没有及时调整和改进。绩效考核的周期和频率不适当,不能及时反映员工的工作进展和成果。绩效考核的评分标准不一致或不公正,造成员工的不满和抵触......
    • Android网络图片三级缓存策略
      在移动应用中,我们一般将网络图片分为三个级别,第一级别是网络层,即根据图片的url地址可以找到服务器上相应图片,获取这一层的图片会消耗流量,所以我们希望可以获取后本地就永久使用,所以就会有接下来的缓存策略;第二层缓存是在手机内存层,是将第一层的图片下载到手机内存,这种缓存读取速度......
    • Android NDK链接静态库动态库
      在NDK中使用LOCAL_LDLIBS进行链接LOCAL_LDLIBS:=/home/tsh/work/ndk-demo/dobby/libdobby.aLOCAL_LDLIBS+=-llog如果在AOSP环境中中可以使用LOCAL_SHARED_LIBRARIES:=liblogLOCAL_STATIC_LIBRARIES+=/home/tsh/work/ndk-demo/dobby/libdobby.a......
    • Kali Linux中使用Vysor对Android设备进行投屏
      在Window有很多Android投屏软件,Linux相对较少,在网上查找大部分的人都是使用的scrcpy这个工具,由于在最新版中Kali无法自带的apt仓库下载该软件┌──(junglezt㉿Ubuntu)-[~]└─$sudoaptinstallscrcpy正在读取软件包列表...完成正在分析软件包的依赖关系树...完成正在读......
    • 极客时间--golang并发实战课--Mutex的常见使用错误场景
      1.Lock/Unlock没有成对出现,就意味着会出现死锁的情况,或者是因为Unlock一个未加锁的Mutex而导致panic。2.第二种误用是Copy已使用的Mutex。Packagesync的同步原语在使用后是不能复制的。原因在于,Mutex是一个有状态的对象,它的state字段记录这个锁的状态。如果你要复......
    • 基于Android 网上商城系统设计与实现
      随着移动通信与Internet的飞速发展及相互融合,GPRS使无线网络高速接入到Internet成为现实,移动用户从而可以享受到Internet提供的服务。这样,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。本文首先给出了系统研究背景,对当前手机操作系统发展做了简单的介绍。Android是基于Li......
    • java软件开发工程师实习求职常见面试题
      1、请说出作用域public,private,protected,以及不写时的区别这四个作用域的可见范围如下表所示。说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。 作用域   当前类同一package子孙类其他packagepublic   √    √         √      ......
    • 写给Android工程师的协程指南
      这是一份写给Android工程师的协程指南,希望在平静的2023,给大家带来一些本质或者别样的理解。引言在Android的开发世界中,关于异步任务的处理一直不是件简单事。面对复杂的业务逻辑,比如多次的异步操作,我们常常会经历回调嵌套的情况,对于开发者而言,无疑苦不堪言。当Kotlin协程出......