亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

等待主框架加載時出現 JxBrowser TimeoutException

等待主框架加載時出現 JxBrowser TimeoutException

胡子哥哥 2022-11-02 15:41:46
我在一個項目中使用 JxBrowser。我只使用本地 HTML 文件,因此使用以下方法呈現我的 HTML 文件:    public static void loadHTMLFile(Browser browser, String filename){        String current = PathUtils.getCurrentDir();        browser.loadURL("file:///" + current + "/some/path/in/my/project/resources/web/" + filename);    } 在某些情況下,我必須使用invokeAndWaitFinishLoadingMainFrame -方法,因為我必須初始化必須首先完全加載的按鈕。來自官方 JxBrowser 網站 ( https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013107-loading-waiting ) 的示例如下所示:// Blocks current thread execution and waits until http://www.google.com web page is loaded completelyBrowser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {    @Override    public void invoke(Browser value) {        value.loadURL("http://www.google.com");    }});就我而言,它看起來像這樣:public static void loadHTMLFileComplete(Browser browser, String filename){    Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {        @Override        public void invoke(Browser value) {            loadHTMLFile(value, filename);        }    });}到目前為止,我想沒有什么令人驚訝的......現在是棘手的部分:invokeAndWaitFinishLoadingMainFrame方法是問題所在:使用invokeAndWaitFinishLoadingMainFrame -方法正確加載了第一個視圖(登錄視圖)之后,當再次 使用invokeAndWaitFinishLoadingMainFrame -方法時,我的程序超時(下面的完整異常)例如,當我單擊登錄按鈕并希望被轉發到主視圖時有一個小技巧,我偶然發現讓它暫時工作(現在它變得令人毛骨悚然):當我在谷歌之間加載在線網頁時,超時問題消失了也可以使用invokeAndWaitFinishLoadingMainFrame -方法我就是這樣做的public static void loadGoogle(Browser browser){    Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {    @Override    public void invoke(Browser value) {        value.loadURL("http://www.google.com");    }});}這里出現了我之前提到的 timeoutException:-- Product name: JxBrowser-- Licensed version: 6.x-- Licensed to: -- License type: Evaluation-- Generation date: 21.04.2019-- Expiration date: 21.05.2019-- License info: Single-user license-- Current date: 30.04.2019JxBrowser license valid.
查看完整描述

1 回答

?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

JxBrowser 基于 Chromium 引擎,繼承了其多進程架構。每個Browser實例與至少一個處理 DOM 和 JavaScript 相關功能的渲染進程相關聯。當您導航到不同的域時,Chromium 引擎會創建一個新的渲染進程并終止舊的渲染進程。如果您在一個域內導航,則呈現過程保持不變。


從調用堆棧中,我看到您嘗試從 DOM 偵聽器中加載 URL。DOM 偵聽器是同步調用的,因此在 Java 處理事件時渲染進程保持阻塞。


當你加載一個 URL 時,例如 google.com,一切正常,因為一個新的渲染進程被創建,并且一旦頁面被加載,該Browser.invokeAndWaitFinishLoadingMainFrame方法返回控制并且舊的渲染進程被終止。但是,如果您嘗試加載file:///URL,則渲染過程保持不變,并且無法開始加載,因為渲染過程被Browser.invokeAndWaitFinishLoadingMainFrameDOM 偵聽器調用的方法阻塞,因此您會遇到死鎖。


為了避免此異常,您不應從 DOM 偵聽器中啟動同步導航。


根據調用堆棧,您loadView從DOMEventListener. 為了避免死鎖,您應該異步調用此方法,例如:


import com.teamdev.jxbrowser.chromium.dom.events.DOMEvent;

import com.teamdev.jxbrowser.chromium.dom.events.DOMEventListener;


import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;


public class MyDomEventListener implements DOMEventListener {


    private final ExecutorService executorService;

    private final OrderCreationView view;


    public MyDomEventListener(OrderCreationView view) {

        this.view = view;

        this.executorService = Executors.newCachedThreadPool();

    }


    @Override

    public void handleEvent(DOMEvent domEvent) {

        // Do not block the current thread and invoke the loadView method asynchronously.

        executorService.execute(view::loadView);

    }

}

在該loadView方法中,您可以同步加載 HTML:


public void loadView() {

    Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() {

        @Override

        public void invoke(Browser browser) {

            browser.loadHTML("");

        }

    });

    initLoginButton();

}


查看完整回答
反對 回復 2022-11-02
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號