Angularjs Phonegap Android使用Websockets

时间:2013-03-22 16:51:09

标签: javascript android cordova angularjs websocket

我甚至不知道如何直接解释这个,但我会尝试。

简介

我正在使用angularjs构建一个Phonegap应用程序,我正在尝试拼接WebSocket消息以更新我的UI。我曾经有过定期与服务器通信的服务,并相应地更改了他们的数据,并且它运行良好。一个例子:

Service1.js

     var applyUpdate = function (
         angular.extend(instance, data);
         if (!$rootScope.$$phase) $rootScope.$apply();
     };

     this.update = function () {
         DataProvider.get('getThermostatSettings', {}, applyUpdate, function(){}, true);
     }

所以基本上我只是每隔5秒调用一次“更新”功能,从服务器接收数据并更新此服务。然后,控制器只需访问此服务,一切正常。

问题

现在的问题是,我缝了一个用java编写的WebSocket接口,它为我处理所有的websocket实现。我从https://github.com/ziadloo/PhoneGap-Java-WebSocket获取了它。它基本上注册了一个可以从Javascript访问的Javascript接口,以便与java进行通信。

每次我现在都有变化,我只是通过WebSocket从服务器推出一个字符串,说它应该更新,然后我在我的javascript中调用服务中的“更新”功能,而不是定期查询数据,这只是愚蠢的。

WebSockets运行良好。我可以看到消息来了,我调用更新,它从服务器正确地获取所有内容,“更新”函数调用然后调用具有正确值等的“applyUpdate”,甚至调用“$ rootScope。$ apply”。

但是角度服务中的所有更新数据都不可见!似乎所有这些变化都在不同的线程中运行!?!?。我知道javascript是单线程的,但它似乎就是这样。

让我以更好的方式提出这个问题:我的印象是,只要WebView调用javascript回调函数,我就会运行一个不同的javascript“线程”,并且无法访问它之外的任何内容

有关它的更多信息

我写了一个函数,只需每隔 5秒输出一个数字。 websocket更新此号码。我的输出如下:

N: 1
N: 1

然后在WebSocket用新的Number(2)推送数据后,我得到两个打印:

N: 1
N: 2

N: 1
N: 2

N: 1
N: 2

任何人都对此有任何指示?有人试过做类似的事吗?我不是专业的角色,但是只要我从java界面获得回调,就会发现一切都搞砸了。

我已经查看过:Angularjs model changes after websocket data push from server我的代码看起来非常相似。我认为唯一的问题是来自Java的回调。

谢谢

更新:AngularJS存在问题。如果我在窗口全局变量中设置此变量,则所有内容都会正常分配。是否有可能Angular以某种方式创建两个不同的$ scope?

更新[2] :更清楚一点:在浏览器中,一切都按预期工作。只有当我在模拟器中运行它时才会搞砸这个东西。

1 个答案:

答案 0 :(得分:2)

Angular.js完全有可能制作两个$范围。只需查看this screencast中的调试内容。

show all the $scopes on the page可能有所帮助。

你也应该知道websockets on mobile aren't the best idea。基于该演讲(由具有websockets专业知识的Nodejitsu员工),崩溃和失败似乎非常可能。