android那些事--WebView攔截使用

WebView最簡單的用法就是loadUrl方法.
常用代碼如下.

 demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
                return true;
            }
        });
        demoWv.loadUrl("https://www.baidu.com");
這里寫圖片描述

WebView攔截請求

WebView調(diào)用loadUrl后,會首先根據(jù)傳入U(xiǎn)RL獲取響應(yīng),然后再將響應(yīng)顯示到頁面上,這就是WebView的原理.根據(jù)這個(gè)原理,那么我們可以在獲取響應(yīng)過程中重新改變請求URL或者直接將響應(yīng)替換.
而具體的替換在WebViewClient的:

WebResourceResponse shouldInterceptRequest(
WebView view,WebResourceRequest request
)

這個(gè)方法中,該方法用于根據(jù)請求去獲取響應(yīng),如果返回null,那么android會根據(jù)請求去獲取響應(yīng)并返回,但是如果你重寫了該方法并返回了響應(yīng),那么WebView就會使用你的響應(yīng)數(shù)據(jù).其中WebResourceRequest封裝了請求,WebResourceResponse封裝了響應(yīng).

使用靜態(tài)響應(yīng)

既然知道了原理,就可以寫個(gè)demo測試一下

        demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
                return true;
            }
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                String result = "<html>\n" +
                        "<title>千度</title>\n" +
                        "<body>\n" +
                        "<a href=\"www.taobao.com\">千度</a>,比百度知道的多10倍\n" +
                        "</body>\n" +
                        "<html>";
                WebResourceResponse response = new WebResourceResponse("text/html",
                        "utf-8",
                        new ByteArrayInputStream(result.getBytes()));
                return response;
            }
        });
        demoWv.loadUrl("https://www.baidu.com");
這里寫圖片描述

使用網(wǎng)絡(luò)資源響應(yīng)

shouldInterceptRequest方法API還有介紹,該方法是在非UI線程中,所以當(dāng)需要與View系統(tǒng)交互時(shí)需要小心.既然時(shí)非UI線程中,那么我們可以放在其中做網(wǎng)絡(luò)請求.比如可以可以去www.importnew.com的響應(yīng)數(shù)據(jù),將百度替換為importnew.

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        demoWv = ((WebView) findViewById(R.id.demoWv));
        WebSettings settings = demoWv.getSettings();
//        網(wǎng)頁中含有JavaScript腳本時(shí),需要調(diào)用以下方法,參數(shù)為true
        settings.setJavaScriptEnabled(true);
        demoWv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//                是否使用第三方瀏覽器 返回true不調(diào)用 返回false調(diào)用
                return true;
            }
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return getWebRes();
            }
        });
        demoWv.loadUrl("https://www.baidu.com");
    }

    private WebResourceResponse getWebRes() {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            URL url = new URL("http://www.importnew.com/");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url
                    .openConnection();
//            連接主機(jī)超時(shí)時(shí)間
            httpURLConnection.setConnectTimeout(10 * 1000);
//            設(shè)置從主機(jī)讀取數(shù)據(jù)超時(shí)
            httpURLConnection.setReadTimeout(40 * 1000);
            bufferedReader = new BufferedReader(new
                    InputStreamReader(httpURLConnection
                    .getInputStream()));
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                            stringBuilder.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (bufferedReader!=null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
           
             }
        }
        WebResourceResponse webResourceResponse = null;
        webResourceResponse=new WebResourceResponse("text/html",
                "utf-8",
                new ByteArrayInputStream(stringBuilder.toString().getBytes()));
        return webResourceResponse;
    }
這里寫圖片描述

注意:WebView中調(diào)用的每個(gè)請求都會經(jīng)過那個(gè)攔截器,所以如果一個(gè)頁面中又有超鏈接,那么依然會經(jīng)過那么攔截器.所以上面的Importnew中有些圖片沒有加載出來.因?yàn)槭且晕谋拘问巾憫?yīng)的,并且是以utf-8做為編碼的,所以有時(shí)候會出現(xiàn)亂碼.

應(yīng)用

在實(shí)際應(yīng)用中,最好時(shí)先判斷要加載的URL是否需要攔截,如果不是的話,可以以然交給WebView去實(shí)現(xiàn).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容