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