在前面一篇筆記http://blog.csdn.net/chenshaoyang0011/article/details/8634235中,描述了解決XML中攜帶CDATA和HTML實體字符的解決辦法,接下來要解決的問題就是緩存圖片。
在這篇文章中主要記錄了對以下問題的解決方法:
1、WebView中圖片點擊事件的響應
2、WebView圖片緩存,并替換WebView默認圖片(即圖片未加載前顯示的樣式)
在新聞內容顯示的時候,圖片是必不可少的,在內容加載完畢之后,圖片的緩存也是非常必要的,畢竟對于手機應用,流量是非常寶貴的資源。對于圖片,WebView本身有一個緩存數(shù)據(jù)庫進行緩存。但是我使用的是另外一個思路進行圖片的緩存——阻止WebView加載圖片而是在WebView將文本加載好了之后,通過本地方法下載圖片保存到本地后再顯示到WebView中。這樣,在使用WebView進行顯示的時候能夠更加的靈活。
在實現(xiàn)上述提到的功能之前,需要了解Android的WebView如何實現(xiàn)Java代碼與JavaScript代碼的相互調用,推薦兩篇博文http://blog.csdn.net/wangtingshuai/article/details/8631835 (實現(xiàn)簡單調用)和http://blog.csdn.net/wangtingshuai/article/details/8635787 (實現(xiàn)圖片點擊)本文就不再贅述了。接下來就詳細的探討下上述功能的實現(xiàn)方法。
一、響應WebView中圖片點擊事件。
對于此功能的實現(xiàn),可以參照http://blog.csdn.net/wangtingshuai/article/details/8635787 這篇文章。其中主要涉及到JS與JAVA代碼的互調,這里我就不重新造輪子了。
二、緩存WebView中的圖片,替換默認圖片
WebView本身有自己的緩存機制,但是由于沒有找到相關的文檔,感覺不是很好用,所以我就想了另外一個方法。主要思路是這樣的:1、使用jsoup來解析html;2、獲取所有圖片的URL(即img標簽的url),替換為需要顯示默認狀態(tài)的圖片的URI,最后在圖片下載好后將這些URI按照某種映射規(guī)則替換為本地的URI(即相當于將這個img指向了本地的一張圖片);3、關閉WebView加載圖片,加載html;4、在文本加載完畢之后,開始依次下載所有的img到本地,每張圖片下載好后,調用js代碼刷新圖片。
下面就一步一步的來實現(xiàn)。
1、使用jsoup解析html
這個我在http://blog.csdn.net/chenshaoyang0011/article/details/8640987 已經簡單的介紹了,詳細的使用還需參照http://jsoup.org/ (后文中代碼使用了很多jsoup的api)。
2、獲取所有圖片的url,并替換為本地圖片(需要用來替換WebView默認顯示效果的圖片)。
獲取到的圖片的url需要保存到一個屬性List<String>中:
使用以下代碼片段可以從html中獲取所有img標簽的url,并且按照如下映射規(guī)則替換為本地圖片的URI(當然這個映射規(guī)則由自己定啦~~):"http://.../xx.xx"替換為"file://mnt/sdcard/test/xx.xx"其實就是將圖片下載后保存的路徑。
3、關閉WebView加載網絡圖片,加載html先顯示文本內容
這樣做主要是為了改善用戶體驗,阻止WebView自己加載圖片是避免重復下載圖片浪費流量。
首先關閉WebView加載網絡圖片,其實由于我們已經替換掉了img中url,可以忽略這一步。但是為了避免有漏網之魚,還是加上好些:
webView.getSettings().setBlockNetworkImage(true);
接下來加載html:
4、在文本加載完畢之后,開始依次下載所有的img到本地,每張圖片下載好后,調用js代碼刷新圖片。
文本內容加載完畢之后,就可以開始加載圖片內容了,在html內容加載完之后,會調用WebViewClient.onPageFinished(WebView view, String url)這個方法。我們就可以在這個方法中執(zhí)行圖片的下載保存工作。
以下的代碼片段就實現(xiàn)了開始下載的功能:
上面的代碼中DownloadWebImgTask的實現(xiàn)如下,其功能就是批量的下載圖片,并且在每張圖片下載好后刷新WebView。由于WebView本身沒有提供接口實現(xiàn)圖片的單獨刷新(至少我沒有找到。。。),所以只能借助js來實現(xiàn)此功能。
這樣圖片就被正常的顯示出來,并且在本地已經有緩存了。
最后照例給出一個簡單的demo:http://download.csdn.net/detail/chenshaoyang0011/5130931
聯(lián)系客服