首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android WebView 與 JS 交互:異步獲取 HTML 內容的正確時機

     編輯:程式設計綜合問答

問題場景

在 WebView 加載頁面後,通過 JS 交互獲取頁面 HTML 源碼並處理。但處理代碼總在獲取到 HTML 之前執行,導致數據為空或異常。

錯誤做法

在普通異步任務(如 Thread、AsyncTask、Kotlin 協程)中直接調用 evaluateJavascript 獲取 HTML,隨後立即處理。由於 JS 執行與 Java/Kotlin 代碼屬於不同線程且異步回調,無法保證順序。

正確解決方案

將處理邏輯放入 WebViewClient 的 onPageFinished(WebView view, String url) 回調中:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 頁面加載完成(含 JS 執行),此時獲取 HTML 最可靠
        view.evaluateJavascript("(function() { return document.documentElement.outerHTML; })();", 
            new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String html) {
                    // 這裡處理獲取到的 html 字符串
                    processHtml(html);
                }
            });
    }
});

關鍵點

  • onPageFinished 確保頁面 DOM 樹構建完畢,JS 環境就緒。
  • evaluateJavascript (API 19+) 異步執行 JS 並通過回調返回結果,避免阻塞 UI 線程。
  • 若需在頁面加載過程中多次獲取,可結合 onPageCommitVisible 或自定義 JS 接口 (addJavascriptInterface) 由網頁主動通知。

注意事項

  • 啟用 JS:webView.getSettings().setJavaScriptEnabled(true);
  • HTTPS 頁面混合內容策略可能影響 JS 執行,需配置 setMixedContentMode。
  • 釋放資源:onDestroy 中調用 webView.destroy()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved