在 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) 由網頁主動通知。webView.getSettings().setJavaScriptEnabled(true);setMixedContentMode。onDestroy 中調用 webView.destroy()。