天天看點

Android中WebView攔截替換網絡請求資料

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流形式)。

示例下載下傳

  • 百度雲盤