【问题标题】:Javascript-Java-Bridge sometimes not working (JxBrowser 6.3)Javascript-Java-Bridge 有时不工作 (JxBrowser 6.3)
【发布时间】:2016-05-10 10:29:51
【问题描述】:

我在使用最新的 jxBrowser 时遇到了一些问题。
我添加了带有 onScriptContextCreated 的 javascript-java-bridge:

        mainBrowser.addScriptContextListener(new ScriptContextAdapter()
    {
        @Override
        public void onScriptContextCreated(ScriptContextEvent event)
        {
            Browser browser = event.getBrowser();
            JSValue jsValue = browser.executeJavaScriptAndReturnValue("window");
            jsValue.asObject().setProperty("app", new JavascriptBridge());
            logger.info("Set app context in JS");

        }
    });

在 JS 中,我有一个名为“gwtAdapter”的函数,其中调用了两个 Java 函数:

function gwtAdapter(name, params, callback)
{

try
{
    if (name == "saveSelectedLoginData")
    {
        app.sendMessageNew(name, params, callback);

        console.log("DURCH DURCH DURCH");
    }
    else
    {
        console.log("Call sendMessage: \n\tName:" + name + "\n\tParams: " + params);

        app.sendMessage(name, [params]);

        console.log("Call sendMessage: \n\tName:" + name + "\n\tCallback: " + callback);
        app.setMessageCallback(name, callback);
    }

}
catch(err)
{
    console.log("Error in gwtAdapter: " + err.message);
}
}

请不要讨论这些功能的合理性;)它们是有原因的。
在某些情况下,浏览器在到达 app.sendMessage 时会挂起,然后我没有收到任何日志或错误消息。然后我就不能再与 DevTools 控制台交互了。

我不知道应该添加哪些信息,因为我找不到可以添加但可能有用的信息。
LogLevel 已经在 Level.ALL 上。

如果您有任何问题,请随时提问,以便我补充。

编辑_1:

jxbrowser-browser.log:

Mai 10, 2016 11:51:04 AM com.teamdev.jxbrowser.chromium.BrowserType getDefault
INFORMATION: JxBrowser type: HEAVYWEIGHT

jxbrowser-chromium.log:空

jxbrowser-ipc.log:它没有记录任何对这个错误有用的东西

编辑_2:

奇怪... 挂起后大约需要 8 分钟才能通过该功能,但之后 javascript-java-bridge 坏了。

这里有一些日志:

Mai 10, 2016 2:52:55 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=907, level=0, message='Save LoginData now!', lineNumber=568, sourceId='file:///workspace/xxxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 2:52:55 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=13, javaObjectId=0, contextPtr=140448130669824, methodName='sendMessageNew', parameters='s21:saveSelectedLoginData:s158:{"saveLoginData": {"selectedUser": "testuser", "selectedPassword": "testuser", "selectedSystem": "xxxxxx", "selectedLanguage": "de"}}:of140448149924128:', returnValue='', errorMessage=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=12, javaObjectId=0, contextPtr=140448130669824, methodName='setMessageCallback', parameters='s6:getUrl:of140448129618576:', returnValue='', errorMessage='Failed to send message.'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: ExecuteJavaScriptMessage{type=ExecuteJavaScript, uid = 40, frameId=-1, javaScript='window', hasReturnValue=true, returnValue='null'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  ExecuteJavaScriptMessage{type=ExecuteJavaScript, uid = 40, frameId=-1, javaScript='window', hasReturnValue=true, returnValue='oo140448128891328:'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: JSInvokeFunctionMessage{type=JSInvokeFunction, uid=41, objectPtr=140448128891328, functionPtr=140448149924128, contextPtr=140448130669824, frameId=-1, args='on:', result='null', error='null'}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  JSInvokeFunctionMessage{type=JSInvokeFunction, uid=41, objectPtr=140448128891328, functionPtr=140448149924128, contextPtr=140448130669824, frameId=-1, args='on:', result='ou:', error=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelWriter run
INFORMATION: WRITE: OnInvokeJSJavaMessage{type=OnInvokeJSJavaEvent, uid=13, javaObjectId=0, contextPtr=140448130669824, methodName='sendMessageNew', parameters='s21:saveSelectedLoginData:s158:{"saveLoginData": {"selectedUser": "testuser", "selectedPassword": "testuser", "selectedSystem": "xxxxxxx", "selectedLanguage": "de"}}:of140448149924128:', returnValue='', errorMessage=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=1119, level=0, message='voidFunction called', lineNumber=1153, sourceId='file:///workspace/xxxxxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=1120, level=0, message='voidFunction-response: null', lineNumber=1156, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=1121, level=0, message='DURCH DURCH DURCH', lineNumber=95, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  JSInvokeFunctionMessage{type=JSInvokeFunction, uid=39, objectPtr=140448151648656, functionPtr=140448129618576, contextPtr=140448130669824, frameId=-1, args='s234:{"response":{"url":"xxxxxxxxx"},"exceptions":{},"success":true}:', result='xxxxxxxx', error=''}, SocketInfo{cid=0, bid=0, channelType=Render}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=1122, level=0, message='Login now!', lineNumber=570, sourceId='file:///workspace/xxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}
Mai 10, 2016 3:01:15 PM com.teamdev.jxbrowser.chromium.internal.ipc.MemoryChannelReader a
INFORMATION: READ:  OnConsoleMessage{type=OnConsoleMessage, uid=1123, level=0, message='Error in gwtAdapter: undefined', lineNumber=110, sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions.js'}, SocketInfo{cid=0, bid=0, channelType=Browser}

我用xxxxxx替换了一些部分

编辑_3:

我想我明白了。也许这是一个错误?

首先是一些代码:

function testFunction()
{
    gwtAdapter("testFunction", '{"gwtIndexGuiReady":true, "xxxxx":1000, "isNewItem":true}', testFunc2);
}

function testFunc2()
{
    gwtAdapter("testFunc2", '{"gwtIndexGuiReady":true, "xxxxx":1000, "isNewItem":true}', voidFunction);
}

function voidFunction(response)
{
    console.log("voidFunction called");
    if(typeof response !== 'undefined')
    {
        console.log("voidFunction-response: " + response);
    }
}

重现错误的步骤:

  1. 启动 JxBrowser
  2. 打开开发者工具
  3. 在 gwtAdapter 中的 app.sendMessage 上设置断点
  4. 调用 testFunction();
  5. 在第二次 gwtAdapter 调用中查看网桥如何无法正常工作

第一个函数调用(来自 testFunction 的 sendMessage)工作正常,但第二个函数调用(来自 testFunc2 的 sendMessage)将无法工作。

一点解释:

gwtAdapter 的最后一个参数是一个回调,它将从 Java 中执行(其中 function 是作为 JSFunction 的回调):

    JSValue jsValue = mainBrowser.executeJavaScriptAndReturnValue("window");

    logger.info("Call callback for: " + name);

    function.invoke(jsValue.asObject(), messageMap.get(name));

在这个回调中,还有另一个对 gwtAdapter 的调用,sendMessage 将在那里中断,或者换句话说,它在 sendMessage 处挂起大约 8:30 分钟,然后传递这个函数。

编辑_4:

可能是线程问题? 我认为它正在执行 javascript-callback 并且在这个回调中它尝试在 Java (sendMessage) 中执行一个函数。我认为它无法执行 javascript 并接收并行调用。

【问题讨论】:

  • 在这种情况下,日志消息非常重要。例如,我在 OnConsoleMessage 消息中看到 JavaScript 代码中存在错误 - 'gwtAdapter 中的错误:未定义',lineNumber=110,sourceId='file:///workspace/xxxxxx/processes/Contents/Login/js/functions。由于 JavaScript 代码中的一些错误,看起来 Java 回调没有被调用。请确保 JavaScript 代码不会在 gwtAdapter() 函数中抛出任何错误。

标签: javafx chromium jxbrowser


【解决方案1】:

昨天TeamDev发布了jxBrowser的6.4版(Chromium v​​49),问题得到解决。

【讨论】:

    【解决方案2】:

    我们最近遇到了类似的问题。

    我们找到了这个解决方案:

    • 在应用程序的其他位置保留对传递的 JavascriptBridge 对象的引用(例如静态变量)。

    我们认为问题的原因是这样的:

    • 对象可能会在某个时间被垃圾回收。这就是桥对象停止工作的时候。
    • 由于未知原因,JX 不像 java 通常那样持有对该对象的引用,这使得它可以进行垃圾回收。
    • 通过将引用保留在您的 java-side-app 中,这不会发生。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      相关资源
      最近更新 更多