Android中處理網(wǎng)頁時我們必然用到WebView,這里我們有這樣一個需求俱恶,我們想讓W(xué)ebView在處理網(wǎng)絡(luò)請求的時候?qū)⒛承┱埱髷r截替換成某些特殊的資源缘琅。具體一點兒說枫虏,在WebView加載 http://m.sogou.com
時擎场,會加載一個logo圖片意系,我們的需求就是將這個logo圖片換成另一張圖片钾腺。
shouldInterceptRequest
好在Android中的WebView比較強大徙垫,從API 11(Android 3.0)開始, shouldInterceptRequest被引入就是為了解決這一類的問題放棒。
shouldInterceptRequest這個回調(diào)可以通知主程序WebView處理的資源(css,js,image等)請求姻报,并允許主程序進行處理后返回數(shù)據(jù)。如果主程序返回的數(shù)據(jù)為null间螟,WebView會自行請求網(wǎng)絡(luò)加載資源吴旋,否則使用主程序提供的數(shù)據(jù)。注意這個回調(diào)發(fā)生在非UI線程中,所以進行UI系統(tǒng)相關(guān)的操作是不可以的厢破。
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)笆焰。
示例代碼
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需要設(shè)定三個屬性,MIME類型见坑,數(shù)據(jù)編碼嚷掠,數(shù)據(jù)(InputStream流形式)。
示例下載
百度云盤