在Android項目中新聞顯示需要使用圖片的異步加載,并且在加載圖片前和加載圖片失敗時顯示默認圖片。
(1) 從相應請求獲取到頁面的數據,處理其中的img標簽,將img標簽中的src屬性存儲在img標簽中的ori_link
屬性中,給img標簽中的src
屬性賦值你默認圖片所在路徑,給img標簽中的src_link
屬性賦值你的圖片下載后保存的路徑
private voidhandleImageClickEvent(Document doc) {
Elements container =doc.getElementsByTag("article");
for (Element ce : container) {
Elements es = ce.getElementsByTag("img");
for (Element e : es) {
String imgUrl = e.attr("src");
if(!imgUrl.startsWith("http://")){
imgUrl = Constants.PIC_URL+imgUrl;
}
imgUrls.add(imgUrl);
String imgName;
imgName = StrMD5.getStrMD5(imgUrl);;
String filePath = "file:///mnt/sdcard/"
+ Constants.WEB_IMAGE_CACHDIR + "/" +imgName;
e.attr("src", "file:///android_asset/news_info_default_image.jpg");
e.attr("src_link", filePath);
e.attr("ori_link", imgUrl);
}
}
(2) 使用webview的loadDataWithBaseURL(Constants.BASE_URL, result,"text/html", "utf-8", null);
Constants.BASE_URL 是為了使在一些頁面中使用js或其他方式訪問自己工程相對路徑資源的時候使用的。
(3) 重寫webview的WebViewClient
,在onPageFinished
方法中啟動圖片異步加載方法:
在task的doInBackground
中下載圖片并保存到sd卡指定位置,下載完一個就通知publishProgress(urlStr)
urlStr是圖片網址。
在task的onProgressUpdate
方法中加載替換img
屬性的js:
@Override
protected void onProgressUpdate(String...values) {
super.onProgressUpdate(values);
mNewsInfoWebview
.loadUrl("javascript:(function(){"
+"var contener =document.getElementsByTagName(\"article\");"
+"var objs;"
+"for(var i=0;i<contener.length;i++){ varobjs=contener[i].getElementsByTagName(\"img\")}"
+ "for(var i=0;i<objs.length;i++) "
+ "{"
+ " var imgSrc =objs[i].getAttribute(\"src_link\"); "
+ " var imgOriSrc =objs[i].getAttribute(\"ori_link\"); "
+ " if(imgOriSrc == \"" + values[0] + "\"){"
+ " objs[i].setAttribute(\"src\",imgSrc);}"
+ "}" + "})()");
}