日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android webView的缓存机制和资源预加载

發布時間:2023/11/29 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android webView的缓存机制和资源预加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android 原生使用WebView嵌入H5頁面 Hybrid開發

一、性能問題

  • android webview 里H5加載速度慢
  • 網絡流量大
1、H5頁面加載速度慢
  • 渲染速度慢

    js解析效率

    js本身的解析過程復雜、解析速度不快,前端頁面設計較多的js代碼文件

    手機硬件設備的性能

    機型多,硬件性能不一

  • 資源加載慢

    H5頁面的資源多

    網絡請求數量多

    ? H5頁面所有資源都需要從網絡請求

  • 二、解決方案

    • webView組件本身的緩存機制
    • 資源預加載
    • 資源攔截

    webView組件本身的緩存機制

    • WebView自帶的緩存機制有5種:瀏覽器 緩存機制

    • Application Cache 緩存機制

    • Dom Storage 緩存機制

    • Web SQL Database 緩存機制

    • Indexed Database 緩存機制

    • File System 緩存機制(H5頁面新加入的緩存機制,雖然Android WebView暫時不支持,但會進行簡單介紹)

      (1) Cache-Control: 用于控制文件在本地緩存的有效時長

      ? eg:Cache-Control:max-age=600,則表示文件在本地應該緩存,且有效時長是600秒(從發出請求算起)。在接下來600秒內,如果有請求這個資源,瀏覽器不會發出 HTTP 請求,而是直接使用本地緩存的文件。

      (2)Expires: 與Cache-Control 功能相同,即控制緩存的有效時間

      ? cache-Control 優先級高

      (3) Last-Modified: 標識文件在服務器上的最新更新時間

      ? 下次請求時,如果文件緩存過期,瀏覽器通過 If-Modified-Since 字段帶上這個時間,發送給服務器,由服務器比較時間戳來判斷文件是否有修改。如果沒有修改,服務器返回304告訴瀏覽器繼續使用緩存;如果有修改,則返回200,同時返回最新的文件。

      (4) Etag:功能同Last-Modified, 即標識文件在服務器上的最新更新時間

    優點:支持Http協議層

    缺點:緩存文件需要首次加載后才會產生;瀏覽器緩存的存儲空間有限,緩存有被清楚的可能,緩存的文件沒有校驗

    可以緩存講臺文件資源,如JS,CSS、文本、圖片等,webView 會將緩存的文件記錄及文件內容會存在當前appde data目錄中,

    Application Cache 緩存機制

    以文件為單位進行緩存,且文件有一定更新機制(類似于瀏覽器緩存機制)

    AppCache : manifest 屬性和manifest文件

    <!DOCTYPE html> <html manifest="demo_html.appcache"> // HTML 在頭中通過 manifest 屬性引用 manifest 文件 // manifest 文件:就是上面以 appcache 結尾的文件,是一個普通文件文件,列出了需要緩存的文件 // 瀏覽器在首次加載 HTML 文件時,會解析 manifest 屬性,并讀取 manifest 文件,獲取 Section:CACHE MANIFEST 下要緩存的文件列表,再對文件緩存 <body> ... </body> </html>

    // 原理說明如下:
    AppCache 在首次加載生成后,也有更新機制。被緩存的文件如果要更新,需要更新 manifest 文件
    因為瀏覽器在下次加載時,除了會默認使用緩存外,還會在后臺檢查 manifest 文件有沒有修改(byte by byte)
    發現有修改,就會重新獲取 manifest 文件,對 Section:CACHE MANIFEST 下文件列表檢查更新
    manifest 文件與緩存文件的檢查更新也遵守瀏覽器緩存機制
    如用戶手動清了 AppCache 緩存,下次加載時,瀏覽器會重新生成緩存,也可算是一種緩存的更新
    AppCache 的緩存文件,與瀏覽器的緩存文件分開存儲的,因為 AppCache 在本地有 5MB(分 HOST)的空間限制

    // 通過設置WebView的settings來實現WebSettings settings = getSettings();String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";settings.setAppCachePath(cacheDirPath);// 1. 設置緩存路徑settings.setAppCacheMaxSize(20*1024*1024);// 2. 設置緩存大小settings.setAppCacheEnabled(true);// 3. 開啟Application Cache存儲機制

    Application 只調用一次 WebSettings.setAppCachePath() 和
    WebSettings.setAppCacheMaxSize()

    Dom Storage 緩存機制

    通過存儲字符串的Key-Value 對來提供

    sessionStorage:具備臨時性,即存儲與頁面相關的數據,它在頁面關閉后無法使用
    localStorage:具備持久性,即保存的數據在頁面關閉后也可以使用。

    特點:

    • 存儲空間大(5MB): 存儲空間對于不同瀏覽器不同,如Cookies才4KB
    • 存儲安全、便捷:Dom Storage 存儲的數據在本地,不需要經常和服務器進行交互。

    應用:

    ? 存儲臨時、簡單的數據

    ? 類似于sharedPreference機制

    // 通過設置 `WebView`的`Settings`類實現WebSettings settings = getSettings();settings.setDomStorageEnabled(true);// 開啟DOM storage

    Web SQL Database 緩存機制

    ? 基于SQL的數據庫存儲機制

    ? 充分利用數據庫的優勢,可方便對數據進行增加、刪除、修改、查詢。

    應用:

    ? 存儲適合數據庫的結構化數據

    // 通過設置WebView的settings實現WebSettings settings = getSettings();String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";settings.setDatabasePath(cacheDirPath);// 設置緩存路徑settings.setDatabaseEnabled(true);// 開啟 數據庫存儲機制

    官方說明,Web SQL Database 存儲機制不在推薦使用(不在維護),取而代之的是IndexedDB緩存機制。

    IndexedDB緩存機制

    屬于NoSQL數據庫,通過存儲字符串的Key-Value對來提供,類似于Dom Storage 存儲機制的key-value存儲方式

    優點:

    • 功能強大、使用簡單

      通過數據庫的事務(tranction)機制進行數據操作

      可對對象任何屬性生成索引,方便查詢

    • 存儲空間大

      較大的存儲空間,默認推薦250MB(分HOST)

    • 使用靈活

      以key-value的方式存存取對象,可以是任何類型值或對象,包括二級制

      異步的API調用,避免造成等待而影響體驗

    存儲 復雜、數據量大的結構化數據

    // 通過設置WebView的settings實現
    WebSettings settings = getSettings();

    settings.setJavaScriptEnabled(true);// 只需設置支持JS就自動打開IndexedDB存儲機制// Android 在4.4開始加入對 IndexedDB 的支持,只需打開允許 JS 執行的開關就好了。

    資源預加載

    ? 提前加載將使用的H5頁面,即提前構建緩存

    ? 預加載webView 、預加載H5資源

    預加載WebView對象

    ? 提前初始化一個webView對象,后續復用這個webView對象

    預加載H5資源

  • 在應用啟動、初始化第一個WebView對象時,直接開始網絡請求加載H5頁面
  • 后續需打開這些H5頁面時就直接從該本地對象中獲取
  • 自身構建緩存

    為了有效解決 Android WebView 的性能問題,除了使用 Android WebView 自身的緩存機制,還可以自己針對某一需求場景構建緩存機制。

    實現方法:

  • 事先將更新頻率較低、常用 & 固定的H5靜態資源 文件(如JS、CSS文件、圖片等) 放到本地
  • 攔截H5頁面的資源網絡請求 并進行檢測
  • 如果檢測到本地具有相同的靜態資源 就 直接從本地讀取進行替換 而 不發送該資源的網絡請求 到 服務器獲取
  • 實現方法:

    假設現在需要攔截一個圖片的資源并用本地資源進行替代

    mWebview.setWebViewClient(new WebViewClient() {// 重寫 WebViewClient 的 shouldInterceptRequest ()// API 21 以下用shouldInterceptRequest(WebView view, String url)// API 21 以上用shouldInterceptRequest(WebView view, WebResourceRequest request)// 下面會詳細說明// API 21 以下用shouldInterceptRequest(WebView view, String url)@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {// 步驟1:判斷攔截資源的條件,即判斷url里的圖片資源的文件名if (url.contains("logo.gif")) {// 假設網頁里該圖片資源的地址為:http://abc.com/imgage/logo.gif// 圖片的資源文件名為:logo.gifInputStream is = null;// 步驟2:創建一個輸入流try {is =getApplicationContext().getAssets().open("images/abc.png");// 步驟3:獲得需要替換的資源(存放在assets文件夾里)// a. 先在app/src/main下創建一個assets文件夾// b. 在assets文件夾里再創建一個images文件夾// c. 在images文件夾放上需要替換的資源(此處替換的是abc.png圖片)} catch (IOException e) {e.printStackTrace();}// 步驟4:替換資源WebResourceResponse response = new WebResourceResponse("image/png","utf-8", is);// 參數1:http請求里該圖片的Content-Type,此處圖片為image/png// 參數2:編碼類型// 參數3:存放著替換資源的輸入流(上面創建的那個)return response;}return super.shouldInterceptRequest(view, url);}

    ?

    // API 21 以上用shouldInterceptRequest(WebView view, WebResourceRequest request)@TargetApi(Build.VERSION_CODES.LOLLIPOP)@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {// 步驟1:判斷攔截資源的條件,即判斷url里的圖片資源的文件名if (request.getUrl().toString().contains("logo.gif")) {// 假設網頁里該圖片資源的地址為:http://abc.com/imgage/logo.gif// 圖片的資源文件名為:logo.gifInputStream is = null;// 步驟2:創建一個輸入流try {is = getApplicationContext().getAssets().open("images/abc.png");// 步驟3:獲得需要替換的資源(存放在assets文件夾里)// a. 先在app/src/main下創建一個assets文件夾// b. 在assets文件夾里再創建一個images文件夾// c. 在images文件夾放上需要替換的資源(此處替換的是abc.png圖片} catch (IOException e) {e.printStackTrace();}// 步驟4:替換資源WebResourceResponse response = new WebResourceResponse("image/png","utf-8", is);// 參數1:http請求里該圖片的Content-Type,此處圖片為image/png// 參數2:編碼類型// 參數3:存放著替換資源的輸入流(上面創建的那個)return response;}return super.shouldInterceptRequest(view, request);} }); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的android webView的缓存机制和资源预加载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩第九页| 欧美日韩成人一区二区三区 | 无码精品视频一区二区三区 | 国际av在线 | 涩涩视频在线观看免费 | yes4444视频在线观看 | 国产性生活毛片 | 亚洲人成免费电影 | 精品欧美乱码久久久久久1区2区 | 久久久美女视频 | 日本特黄视频 | 2017日日夜夜 | 浪荡奴双性跪着伺候 | 男女激情大尺度做爰视频 | 亚洲91网站 | www.久色| 91福利视频免费观看 | 国产盗摄一区二区三区 | 欧美大片免费看 | 国产美女精品一区二区三区 | 免费播放片大片 | 国产一级片麻豆 | 亚洲成人一区二区在线观看 | 国产91精品久久久久久久 | 亚洲国产精品久久人人爱 | 精品无码一区二区三区电影桃花 | 一区二区中文字幕 | 饥渴放荡受np公车奶牛 | 波多野吉衣av无码 | 欧美在线视频一区二区 | 国产极品视频在线观看 | 免费黄色一级大片 | 国产一区二区三区在线观看免费 | 色婷婷777| 日日射天天干 | 青青草国产在线播放 | 伊人草| 欧美久久精品一级黑人c片 1000部多毛熟女毛茸茸 | 2019国产精品| 中文字幕第一区综合 | 欧美日本在线视频 | 乱色精品无码一区二区国产盗 | 欧美一区二区视频免费观看 | 51成人精品网站 | 隔壁邻居是巨爆乳寡妇 | 日本涩涩视频 | 亚洲国产精品女人久久久 | 国产乡下妇女做爰 | 懂色av一区二区三区四区五区 | 九色网站在线观看 | 丝瓜色版| 欧美无专区 | 手机在线观看免费av | 无码人妻一区二区三区av | 日本超碰在线 | 欧美深夜福利 | 全黄一级片 | 欧美顶级少妇做爰 | sm调教羞耻姿势图片 | 午夜免费福利小视频 | 91理论片午午伦夜理片久久 | www99re| 黑森林福利视频导航 | 国产无码日韩精品 | 91性视频| 日韩精品久久久久久 | 亚洲天堂美女 | yy4138理论片动漫理论片 | 三级黄色在线 | 亚洲精品久久久久久一区二区 | 日本黄在线 | 调教撅屁股啪调教打臀缝av | 自拍偷拍20p| 人妻精品一区二区在线 | 黄色一级视频免费观看 | 好吊日av| 久久国内视频 | 国产一区二区三区电影在线观看 | 欧美怡红院| 在线免费看黄色 | 亚洲无人区小视频 | 精品国产色 | 亚洲精品视频免费 | 日本久久激情 | 91香蕉嫩草 | 99re这里只有精品在线 | 在线能看的av | 91精品播放| 黄色小视频免费看 | 天天做天天爱天天做 | 最好看的2019年中文在线观看 | 爱情岛黄色 | 欧美精品91 | 狠狠干天天操 | 九九视频免费在线观看 | 91麻豆精品国产91久久久久久 | 91毛片视频 | 亚洲逼| 国产乱大交 |