WebView中實現延遲加載,圖片點擊時才加載。


 1           String newHtml = html + 
 2                     "<script type=\"text/javascript\">" +
 3                         "(function (){"+
 4                             "var imageList = document.getElementsByTagName(\"img\");"+
 5                             "for(var i=0; i<imageList.length; i++){"+
 6                                 "var image = imageList[i];"+
 7                                 "image.href = image.src;"+
 8                                 "image.src = \"content://com.example.demo/res/def.jpg\";"+
 9                                 "image.alt = \"點擊加載圖片\";"+
10                                 "image.onclick = function(){"+
11                                     "this.src = this.href;" +
12                                     "return false;"+
13                                 "}"+
14                             "}"+
15                         "}());"+
16                     "</script>";
17        
mWebView.getSettings().setJavaScriptEnabled(true);
18        mWebView.loadData(newHtml, "text/html; charset=UTF-8", null);
以上的代碼是在獲取到的html頁面后面添加一個自動執行的js函數,把所有圖片標簽的地址替換為一個占位圖,當圖片被點擊時再加載真實的圖片。
要加載應用自帶的圖片,我們可以用ContentProvider來實現。在com.example.demo.provider包目錄下創建一個ContentProvider,重寫openAssetFile方法來獲取Assets文件夾里的占位圖,然后在AndroidManifest.xml里注冊ContentProvider。
 1   @Override
 2     public AssetFileDescriptor openAssetFile(Uri uri, String mode)
 3             throws FileNotFoundException {
 4         String fileName = uri.getLastPathSegment();
 5         try {
 6             return getContext().getAssets().openFd(fileName);
 7         } catch (IOException e) {
 8             e.printStackTrace();
 9             return super.openAssetFile(uri, mode);
10         }
11     }

 

1     <provider 
2             android:name="com.example.demo.database.ImageContentProvider"
3             android:authorities="com.example.demo" />

但是這個方法只能用在Android4.4以下的版本,4.4以后的版本換了WebView的內核后這個辦法就無效了。所以我們可以用WebViewClient中一個API11開始提供的一個接口shouldInterceptRequest來實現攔截。

 1     public WebResourceResponse shouldInterceptRequest(WebView view,
 2                 String url) {
 3             WebResourceResponse response = null;
 4             if (url.contains("def.jpg")) {
 5                 try {
 6                     InputStream image = getAssets().open("def.jpg");
 7                     response = new WebResourceResponse("image/jpeg", "UTF-8", image);
 8                 } catch (IOException e) {
 9                     e.printStackTrace();
10                 }        
11             }
12             return response;
13         }

最省事的話就是隨便找個雲儲存,自己上傳一張圖片到上面。然后用這張圖片的URL作為占位圖,反正WebView會自動緩存數據,所以這張圖片只會讀取一次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM