Android中處理網頁時我們必然用到WebView,這裡我們有這樣一個需求,我們想讓WebView在處理網絡請求的時候将某些請求攔截替換成某些特殊的資源。具體一點兒說,在WebView加載
http://m.sogou.com
時,會加載一個logo圖檔,我們的需求就是将這個logo圖檔換成另一張圖檔。
shouldInterceptRequest
好在Android中的WebView比較強大,從API 11(Android 3.0)開始, shouldInterceptRequest被引入就是為了解決這一類的問題。
shouldInterceptRequest這個回調可以通知主程式WebView處理的資源(css,js,image等)請求,并允許主程式進行處理後傳回資料。如果主程式傳回的資料為null,WebView會自行請求網絡加載資源,否則使用主程式提供的資料。注意這個回調發生在非UI線程中,是以進行UI系統相關的操作是不可以的。
shouldInterceptRequest有兩種重載。
- public WebResourceResponse shouldInterceptRequest (WebView view, String url) 從API 11開始引入,API 21棄用
- public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request) 從API 21開始引入
本次例子暫時使用第一種,即shouldInterceptRequest (WebView view, String url)。
示例代碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WebView webView = new WebView(this); webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { Log.i(LOGTAG, "shouldInterceptRequest url=" + url + ";threadInfo" + Thread.currentThread()); WebResourceResponse response = null; if (url.contains("logo")) { try { InputStream localCopy = getAssets().open("droidyue.png"); response = new WebResourceResponse("image/png", "UTF-8", localCopy); } catch (IOException e) { e.printStackTrace(); } } return response; } }); setContentView(webView); webView.loadUrl("http://m.sogou.com"); |
---|
其中WebResourceResponse需要設定三個屬性,MIME類型,資料編碼,資料(InputStream流形式)。
示例下載下傳
- 百度雲盤