成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WebView想說愛你不容易啊

移動(dòng)開發(fā) 移動(dòng)應(yīng)用 Android
現(xiàn)在的手機(jī)高度定制,多多少少都會(huì)對(duì)系統(tǒng)原生的代碼進(jìn)行了修改和添加的,不同的手機(jī)的WebView呈現(xiàn)出來的效果也是不同的,可以說是五彩繽紛了,所以我懂Android開發(fā)者的痛苦。接下來我就具體去講解我在項(xiàng)目中使用WebView的經(jīng)驗(yàn),不喜勿噴哈。

[[189802]]

為什么要使用WebView

隨著app業(yè)務(wù)的不斷深入發(fā)展,只靠著原生代碼來堆砌功能是不現(xiàn)實(shí),畢竟開發(fā)的時(shí)長會(huì)增加,而且同時(shí)需要開發(fā)iOS和Android兩套,并且,如果在UI上改變了一丁點(diǎn),都需要提包(雖然Android現(xiàn)在可以進(jìn)行熱更新,但是熱更新不是100%能生效的,其中的原理只要了解過的人都會(huì)知道的),最終我們會(huì)選擇使用原生嵌套H5的方式進(jìn)行開發(fā),這樣,既可以隨時(shí)更改UI,也可以***制的進(jìn)行功能擴(kuò)展,然后,我們就要使用到Android的WebView了,這個(gè)讓我們痛并快樂著的控件。

現(xiàn)在的手機(jī)高度定制,多多少少都會(huì)對(duì)系統(tǒng)原生的代碼進(jìn)行了修改和添加的,不同的手機(jī)的WebView呈現(xiàn)出來的效果也是不同的,可以說是五彩繽紛了,所以我懂Android開發(fā)者的痛苦。接下來我就具體去講解我在項(xiàng)目中使用WebView的經(jīng)驗(yàn),不喜勿噴哈。

使用

一開始相信大家都是直接在布局文件中添加WebView控件,當(dāng)然我一開始也是這樣做的,就是為了簡單,而且也不知道這樣會(huì)出現(xiàn)什么問題。

  1. <WebView     
  2.  
  3.     android:id="@+id/web_view"     
  4.  
  5.     android:layout_width="match_parent"     
  6.  
  7.     android:layout_height="match_parent"/>  

直接就這樣添加了一個(gè)WebView,發(fā)現(xiàn)也沒什么問題啊,一樣可以顯示,什么都是正常的啊。在重復(fù)打開有WebView的頁面時(shí),你會(huì)發(fā)現(xiàn),應(yīng)用的內(nèi)存會(huì)不斷升高,銷毀了之后也不會(huì)降下來,點(diǎn)擊GC也降不下來,這樣就出現(xiàn)了內(nèi)存泄漏了,這時(shí)你就會(huì)發(fā)現(xiàn),這樣使用WebView是不正確的,那么***方式是如何使用呢?

那就是在代碼中動(dòng)態(tài)添加。

首先在布局文件中聲明一個(gè)parent布局

  1. <LinearLayout 
  2.  
  3. android:id="@+id/web_view" 
  4.  
  5. android:layout_width="match_parent" 
  6.  
  7. android:layout_height="wrap_content" 
  8.  
  9. android:orientation="horizontal" 
  10.  
  11. android:scrollbars="none" />  

然后在代碼中,把WebView當(dāng)做其子View添加進(jìn)去

  1. WebView webView = new WebView(context); 
  2.  
  3. webViewLayout.addView(webView);  

網(wǎng)上很多人說這個(gè)context應(yīng)該用application的,我覺得是不對(duì)的,如果你的WebView需要彈出一個(gè)dialog呢?還有其他的不可預(yù)估的問題的,***還是用當(dāng)前的activity的Context是最合適的。

上面說的是如何把WebView添加進(jìn)來進(jìn)行使用,然后到底它有哪些屬性是我們?cè)陂_發(fā)中需要使用到的呢?

  1. webView.loadUrl("www.baidu.com");//WebView加載的網(wǎng)頁使用loadUrl 
  2.  
  3. WebSettings webSettings = webView.getSettings();//獲得WebView的設(shè)置 
  4.  
  5. webSettings.setUseWideViewPort(true);// 設(shè)置此屬性,可任意比例縮放 
  6.  
  7. webSettings.setLoadWithOverviewMode(true);//適配 
  8.  
  9. webSettings.setJavaScriptEnabled(true);  //支持js 
  10.  
  11. webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);  //設(shè)置 緩存模式 
  12.  
  13. webSettings.setDomStorageEnabled(true);// 開啟 DOM storage API 功能 
  14.  
  15. webSettings.setDatabaseEnabled(true);//開啟 database storage API 功能 
  16.  
  17. webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//HTTPS,注意這個(gè)是在LOLLIPOP以上才調(diào)用的 
  18.  
  19. webSettings.setAppCacheEnabled(true);//開啟 Application Caches 功能 
  20.  
  21. webSettings.setBlockNetworkImage(true);//關(guān)閉加載網(wǎng)絡(luò)圖片,在一開始加載的時(shí)候可以設(shè)置為true,當(dāng)加載完網(wǎng)頁的時(shí)候再設(shè)置為false  

上面是使用WebView中最基礎(chǔ)的設(shè)置,相信在開發(fā)過程中都會(huì)進(jìn)行如上的設(shè)置的。

  1. webView.setWebChromeClient(new WebChromeClient() {     
  2.  
  3.      @Override    
  4.  
  5.      public void onProgressChanged(WebView viewint newProgress) { 
  6.  
  7.          //加載的進(jìn)度 
  8.  
  9.      } 
  10.  
  11.      @Override 
  12.  
  13.      public void onReceivedTitle(WebView view, String title) {    
  14.  
  15.          //獲取WebView的標(biāo)題 
  16.  
  17.      } 
  18.  
  19.     @Override 
  20.  
  21.     public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {     
  22.  
  23.         return super.onJsAlert(view, url, message, result); 
  24.  
  25.         //Js 彈框 
  26.  
  27.     } 
  28.  
  29.     @Override 
  30.  
  31.     public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {    
  32.  
  33.         AlertDialog.Builder b = new AlertDialog.Builder(IllegalQueryActivity.this);     
  34.  
  35.         b.setTitle("刪除");     
  36.  
  37.         b.setMessage(message);     
  38.  
  39.         b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {         
  40.  
  41.             @Override         
  42.  
  43.             public void onClick(DialogInterface dialog, int which) {             
  44.  
  45.                 result.confirm();         
  46.  
  47.             }     
  48.  
  49.         });     
  50.  
  51.         b.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {         
  52.  
  53.             @Override         
  54.  
  55.             public void onClick(DialogInterface dialog, int which) {             
  56.  
  57.                 result.cancel();         
  58.  
  59.             }     
  60.  
  61.         });     
  62.  
  63.         b.create().show();     
  64.  
  65.         return true
  66.  
  67.     } 
  68.  
  69. }); 
  70.  
  71. webView.setWebViewClient(new WebViewClient() {     
  72.  
  73.     @Override     
  74.  
  75.     public boolean shouldOverrideUrlLoading(WebView view, String url) {         
  76.  
  77.        //需要設(shè)置在當(dāng)前WebView中顯示網(wǎng)頁,才不會(huì)跳到默認(rèn)的瀏覽器進(jìn)行顯示 
  78.  
  79.        return true;    
  80.  
  81.     }     
  82.  
  83.     @Override     
  84.  
  85.     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
  86.  
  87.         super.onReceivedError(view, request, error); 
  88.  
  89.         //加載出錯(cuò)了 
  90.  
  91.     }    
  92.  
  93.     @Override     
  94.  
  95.     public void onPageFinished(WebView view, String url) {         
  96.  
  97.         super.onPageFinished(view, url); 
  98.  
  99.         //加載完成 
  100.  
  101.     } 
  102.  
  103. }); 
  104.  
  105. webView.setDownloadListener(new DownLoadListener());//下載監(jiān)聽 
  106.  
  107. private class DownLoadListener implements DownloadListener {    
  108.  
  109.     @Override    
  110.  
  111.     public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {       
  112.  
  113.     } 
  114.  
  115.  

然后就是WebView跟JS的交互了

  1. webView.addJavascriptInterface(new WebAppInterface(this), "WebJs"); 
  2.  
  3. public class WebAppInterface {  
  4.  
  5.     Context mContext;     
  6.  
  7.     public WebAppInterface(Context c) {         
  8.  
  9.         mContext = c;     
  10.  
  11.     }     
  12.  
  13.     @JavascriptInterface     
  14.  
  15.     public void method() { 
  16.  
  17.     } 
  18.  
  19.  
  20. webView.loadUrl("javascript:jsMethod()");//這是WebView最簡單的調(diào)用JS的方法  

當(dāng)activity執(zhí)行生命周期的時(shí)候,這里需要注意的是在onDestroy的時(shí)候,需要銷毀WebView,不然也會(huì)出現(xiàn)內(nèi)存泄漏的。

  1. @Overrideprotected void onPause() {     
  2.  
  3.     super.onPause();     
  4.  
  5.     if (webView != null) {         
  6.  
  7.         webView.onPause();     
  8.  
  9.     } 
  10.  
  11.  
  12. @Override 
  13.  
  14. protected void onResume() {     
  15.  
  16.     super.onResume();     
  17.  
  18.     if (webView != null) {         
  19.  
  20.         webView.onResume();     
  21.  
  22.     } 
  23.  
  24.  
  25. @Override 
  26.  
  27. protected void onDestroy() {         
  28.  
  29.     if (webView != null) {         
  30.  
  31.         webView.clearCache(true); //清空緩存    
  32.  
  33.         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {             
  34.  
  35.             if (webViewLayout != null) {                 
  36.  
  37.                 webViewLayout.removeView(webView);             
  38.  
  39.             }             
  40.  
  41.         webView.removeAllViews();             
  42.  
  43.         webView.destroy();         
  44.  
  45.     }else {             
  46.  
  47.         webView.removeAllViews();             
  48.  
  49.         webView.destroy();             
  50.  
  51.         if (webViewLayout != null) {                 
  52.  
  53.             webViewLayout.removeView(webView);            
  54.  
  55.         }         
  56.  
  57.      }   
  58.  
  59.      webView = null;     
  60.  
  61.   }    
  62.  
  63.  

可以看到上面的onDestroy方法中對(duì)系統(tǒng)的版本進(jìn)行了判斷,那是因?yàn)槲以诓煌陌姹局羞M(jìn)行了測試,如果低于5.0版本的WebView中,如果先在parent中remove了WebView,那WebView將無法進(jìn)行destroy了,這樣就會(huì)造成內(nèi)存的泄漏,下來你們可以自己去嘗試一下這個(gè)說法是不是正確的。

現(xiàn)在還遇到的一個(gè)問題就是,當(dāng)WebView嵌套在ScrollView中時(shí),某些機(jī)型會(huì)出現(xiàn)閃屏的問題,單獨(dú)WebView的時(shí)候是不會(huì)出現(xiàn)的,把硬件加速關(guān)閉了之后,對(duì)用戶的體驗(yàn)又不好,所以暫時(shí)還未想到比較好的解決方案,所以還是建議不要在ScrollView中嵌套WebView這樣的控件。 

責(zé)任編輯:龐桂玉 來源: 安卓巴士Android開發(fā)者門戶
相關(guān)推薦

2018-01-24 07:28:20

2013-09-22 09:16:25

碼農(nóng)程序員黑客

2009-09-04 08:19:24

Windows 7優(yōu)缺點(diǎn)

2009-02-12 17:25:21

Windows7試用下載

2011-12-16 14:52:55

移動(dòng)互聯(lián)聯(lián)想

2012-08-20 10:13:39

云計(jì)算服務(wù)配置

2016-02-18 10:52:25

ApplePay綁定失敗蘋果

2013-05-17 10:18:16

2012-05-24 13:24:00

Linux操作系統(tǒng)

2012-06-13 14:58:09

BYOD移動(dòng)辦公

2018-06-01 15:48:22

2018-06-02 13:37:00

2012-03-27 10:53:56

石油開采超級(jí)計(jì)算機(jī)

2021-04-20 19:21:50

臟讀MySQL幻讀

2023-08-31 22:17:15

JavaMySQLB+樹

2018-07-10 11:18:31

私有云混合云遷移

2013-12-30 10:10:50

Windows XP

2015-06-11 11:21:12

免費(fèi)Wi-Fi

2020-06-09 08:19:25

微服務(wù)網(wǎng)站架構(gòu)

2021-05-18 10:53:00

電腦不關(guān)機(jī)壽命
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲激情自拍偷拍 | 天天干视频在线 | 亚洲一区av | 国产成人综合久久 | 91免费版在线 | 久久久久网站 | 久久精品国产久精国产 | 久久久久亚洲精品 | 久久久久亚洲 | 国产精品久久久久久久久久免费 | 亚洲视频免费在线 | 一级一片在线观看 | 亚洲激情在线观看 | 国产成人jvid在线播放 | www中文字幕| 日韩欧美在线观看 | 99精品一区二区 | 亚州激情| 黄色片大全在线观看 | 九九热这里 | 欧美精品在线一区 | 日韩一区在线播放 | 欧美xxxx做受欧美 | 国产精品视频网 | 国产高清一区二区 | 国产精品一区二区视频 | 日韩一区二区三区在线 | 成人激情视频在线观看 | 成人免费观看视频 | 欧美日韩三级视频 | 夜夜爽99久久国产综合精品女不卡 | 亚洲一区免费在线 | 国产在线二区 | 96久久久久久 | 国产精品久久久久久婷婷天堂 | 久久丁香| 久久精品av | 91亚洲国产| 日本黄色免费视频 | 久久精品国产一区二区三区不卡 | 精品久久久久久亚洲精品 |