首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有时不能工作(JxBrowser 6.3)

有时不能工作(JxBrowser 6.3)
EN

Stack Overflow用户
提问于 2016-05-10 10:29:51
回答 2查看 1.1K关注 0票数 0

我对最新的jxBrowser有一些问题。

我在onScriptContextCreated中添加了javascript:

代码语言:javascript
复制
        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-函数:

代码语言:javascript
复制
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上了。

如果你有问题,请随便问,这样我就可以补充一些东西。

Edit_1:

jxbrowser-浏览器.:

代码语言:javascript
复制
Mai 10, 2016 11:51:04 AM com.teamdev.jxbrowser.chromium.BrowserType getDefault
INFORMATION: JxBrowser type: HEAVYWEIGHT

jxbrowser-chromium.log:空

jxbrowser-ipc.log:它对此错误没有任何有用的记录

Edit_2:

奇怪..。挂起之后,传递函数花费了大约8分钟,但之后javascript-javascript就断了。

这里有一些日志:

代码语言:javascript
复制
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替换了一些部件

Edit_3:

我想我明白了。也许是个窃听器?

首先,一些代码:

代码语言:javascript
复制
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. 开放DevTools
  3. 在app.sendMessage上设置gwtAdapter断点
  4. 调用testFunction();
  5. 查看第二次gwtAdapter调用时桥是如何正常工作的

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

一个小小的解释:

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

代码语言:javascript
复制
    JSValue jsValue = mainBrowser.executeJavaScriptAndReturnValue("window");

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

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

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

Edit_4:

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

EN

回答 2

Stack Overflow用户

发布于 2016-05-13 08:10:20

昨天,TeamDev为jxBrowser发布了6.4版(Chromiumv49),解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2018-08-09 14:06:55

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

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

  • 保持对应用程序中其他地方传递的JavascriptBridge对象的引用(例如。静态变量)。

我们相信问题的原因是:

  • 对象可能会在某个时候被垃圾收集。这就是桥对象停止工作的时候。
  • 由于一个未知的原因,JX不像java通常那样保存对该对象的引用,这使得JX非常适合垃圾收集。
  • 通过将引用保留在java端应用程序中,这是不可能发生的。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37135886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档