有這樣的一個需求:
在WebView加載 某網站 時,會加載一個logo圖片,我們的需求就是將這個logo圖片換成另一張圖片。
這時
shouldInterceptRequest
就出場了。
從API 11(Android 3.0)開始, shouldInterceptRequest被引入就是爲了解決這一類的問題。
shouldInterceptRequest這個回調可以通知主程序WebView處理的資源(比如css,js,image等)請求,並允許主程序進行處理後返回數據。如果主程序返回的數據爲null,WebView會自行請求網絡加載資源,否則使用主程序提供的數據。注意這個回調發生在非UI線程中,所以進行UI系統相關的操作是不可以的。
下面我們來看shouldInterceptRequest
shouldInterceptRequest有兩種重載:
//從API 11開始引入,API 21棄用
-
public WebResourceResponse shouldInterceptRequest (WebView view, String url)
//從API 21開始引入
-
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
關鍵代碼:
WebView webView = new WebView(this);
webView.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
WebResourceResponse response = null;
if (url.contains("logo")) {
try {
InputStream localCopy = getAssets().open("aikaifa.png");
response = new WebResourceResponse("image/png", "UTF-8", localCopy);
} catch (IOException e) {
e.printStackTrace();
}
}
return response;
}
});
setContentView(webView);
webView.loadUrl("請求的url");
關鍵的地方
WebResourceResponse需要設定三個屬性,MIME類型,數據編碼,數據(InputStream流形式)。
更多分享請關注,請關注愛開發
每天不僅學到技術,還能分享到更多的正能量哦!還能跟一萬多開發者互動溝通