应用程序无限循环,processMessage失败错误

时间:2015-02-16 10:37:27

标签: javascript cordova

我的Cordova应用未在浏览器和移动设备上运行,但显示错误

  

processMessage失败

截图:

enter image description here

并且进入无限循环并冻结设备任何解决方案?

此问题已经在Cordova not running normally提出,但没有答案,所以我必须再次提出这个问题。

4 个答案:

答案 0 :(得分:14)

遇到同样的问题(使用Chrome和phonegap桌面模拟器。我看到的情况就是这样。

Cordova.js中似乎存在无法检查空消息的错误。 当应用发出警报时: gap_init:2 间隙:[0, “状态栏”, “_准备”, “StatusBar1593157203”] 间隙:[0, “应用”, “显示”, “App1593157204”] 间隙:[0, “文件”, “requestAllPaths”, “File1593157205”] 间隙:[0, “NetworkStatus”, “getConnectionInfo”, “NetworkStatus1593157206”] 间隙:[0, “设备”, “getDeviceInfo”, “Device1593157207”]

然后你只需点击'确定',而不是清除它继续导致无限loooooop的对话框的内容。我不知道这些消息的重要性是的,因为我对科尔多瓦来说还是新手,但这是地狱般的,并且最不让人惊讶!

因此,您可以清除消息,或修改cordova.js代码,使其陷入循环中。您也可以关闭同样有效的警报。

函数processMessage()(见下文)不会测试一个空字符串,它本身可能没什么问题,但它是从一个while循环调用的,它只检查“*”是否会弹出。

while (messagesFromNative.length) {
            var msg = popMessageFromQueue();
            // The Java side can send a * message to indicate that it
            // still has messages waiting to be retrieved.
            if (msg == '*' && messagesFromNative.length === 0) {
                setTimeout(pollOnce, 0);
                return;
            }
            processMessage(msg);
        }

// Processes a single message, as encoded by NativeToJsMessageQueue.java.
    function processMessage(message) {
        try {
            var firstChar = message.charAt(0);
            if (firstChar == 'J') {
                eval(message.slice(1));
            } else if (firstChar == 'S' || firstChar == 'F') {
                var success = firstChar == 'S';
                var keepCallback = message.charAt(1) == '1';
                var spaceIdx = message.indexOf(' ', 2);
                var status = +message.slice(2, spaceIdx);
                var nextSpaceIdx = message.indexOf(' ', spaceIdx + 1);
                var callbackId = message.slice(spaceIdx + 1, nextSpaceIdx);
                var payloadKind = message.charAt(nextSpaceIdx + 1);
                var payload;
                if (payloadKind == 's') {
                    payload = message.slice(nextSpaceIdx + 2);
                } else if (payloadKind == 't') {
                    payload = true;
                } else if (payloadKind == 'f') {
                    payload = false;
                } else if (payloadKind == 'N') {
                    payload = null;
                } else if (payloadKind == 'n') {
                    payload = +message.slice(nextSpaceIdx + 2);
                } else if (payloadKind == 'A') {
                    var data = message.slice(nextSpaceIdx + 2);
                    var bytes = window.atob(data);
                    var arraybuffer = new Uint8Array(bytes.length);
                    for (var i = 0; i < bytes.length; i++) {
                        arraybuffer[i] = bytes.charCodeAt(i);
                    }
                    payload = arraybuffer.buffer;
                } else if (payloadKind == 'S') {
                    payload = window.atob(message.slice(nextSpaceIdx + 2));
                } else {
                    payload = JSON.parse(message.slice(nextSpaceIdx + 1));
                }
                cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback);
            } else {
                console.log("processMessage failed: invalid message: " + JSON.stringify(message));
            }
        } catch (e) {
            console.log("processMessage failed: Error: " + e);
            console.log("processMessage failed: Stack: " + e.stack);
            console.log("processMessage failed: Message: " + message);
        }
    }

答案 1 :(得分:0)

检查你的cordova js装载是否正确? Cordova js的路径是否恰当?

在index.html中提供这样的路径:

<script type="text/javascript" src="cordova.js">

答案 2 :(得分:0)

我在Angular 6项目中遇到了问题。只需删除 src 文件夹下的 cordova.js 即可解决。

答案 3 :(得分:0)

查看@EnableJpaRepositories的{​​{1}}平台选项时,我无法解决此问题;但是,JpaRepositoriesRegistrar平台选项可以正常运行。

解决方案不多,但对于那些关注者来说可能是一个稍微有用的解决方法。