0
点赞
收藏
分享

微信扫一扫

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


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" />


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

     

    好了就先说到这里吧!

    举报

    相关推荐

    0 条评论