Angularjs Phonegap Android usando Websockets
Ni siquiera sé cómo explicar esto directamente, pero lo intentaré.
Intro
- ¿Soporta Android 3.0 WebSockets?
- Conexión de cliente a servidor en aplicaciones de chat como Viber o Telegram
- Android websocket sockjs cliente para java primavera basada webserver
- WebSocket HTML5 en el teléfono para Android
- ¿Puedo conectarme con WebSocket en una aplicación de Android?
Estoy construyendo una aplicación Phonegap con angularjs, y estoy tratando de coser los mensajes de WebSocket para actualizar mi interfaz de usuario. Solía tener servicios que se comunican con el servidor periódicamente y cambiar sus datos en consecuencia y estaba funcionando bastante bien. Un ejemplo:
Service1.js :
var applyUpdate = function ( angular.extend(instance, data); if (!$rootScope.$$phase) $rootScope.$apply(); }; this.update = function () { DataProvider.get('getThermostatSettings', {}, applyUpdate, function(){}, true); }
Así que básicamente estaba llamando a la función "update" cada 5 segundos, recibiendo datos del servidor y actualizando este servicio. Los controladores simplemente accederían a este servicio, y todo funcionaba.
El problema
El problema ahora, es que cosí una interfaz de WebSocket escrita en java, que maneja toda la implementación de websocket para mí. Lo tomé de: https://github.com/ziadloo/PhoneGap-Java-WebSocket . Básicamente registra una interfaz Javascript accesible desde Javascript para comunicarse con java.
Cada vez que tengo un cambio ahora, simplemente empujar una cadena del servidor a través de la WebSocket diciendo que debe actualizar, y luego llamo a la "actualización" función del servicio en mi javascript, en lugar de consultar periódicamente los datos, que es sólo estúpido.
Los WebSockets funcionan bien. Puedo ver el mensaje que viene, llamo a la actualización, se recolecta todo correctamente desde el servidor, la función "update" llama a continuación, el "applyUpdate" con los valores correctos y etc, incluso el "$ rootScope.
¡Pero todos los datos actualizados dentro del servicio angular no son visibles! Parece que todos estos cambios se están ejecutando en un hilo diferente!?!? . Sé que javascript es único subproceso, pero parece tan.
Permítanme poner esto en una mejor manera: Tengo la impresión de que tan pronto como el WebView llama a la función de devolución de llamada javascript, tengo un javascript diferente "hilo" en ejecución, y nada fuera de él se puede acceder
Más información
Escribí una función que simplemente genera un número cada 5 segundos . El websocket actualiza este número. Y mi salida es la siguiente:
N: 1 N: 1
Entonces, después de que el WebSocket empuja los datos con un nuevo número (2), obtengo dos impresiones:
N: 1 N: 2 N: 1 N: 2 N: 1 N: 2
Alguien tiene alguna indicación sobre esto? ¿Alguien intentó hacer algo similar? No soy un profesional anguloso, pero parece que todo se desordena tan pronto como recibo una devolución de llamada desde la interfaz de java.
Ya he mirado: Cambios del modelo de Angularjs después de que el empuje de los datos del websocket del servidor y mi código parece muy similar. El único problema que creo es esta devolución de llamada de Java.
Gracias
Actualización : Es un problema con AngularJS. Si establezco esta variable en una variable global de ventana, todo se asigna normalmente. ¿Es posible que Angular esté de alguna manera creando dos diferentes $ scope?
Actualización [2] : Sólo para ser un poco más claro: En el navegador, todo funciona como se esperaba. Sólo cuando lo ejecuto en el emulador que esta cosa se ensució.
- ¿Cuál es la mejor manera de detectar soporte de websocket usando Javascript?
- Error de Firebase debido a una excepción de puntero nulo
- Spring pedalea cliente web sockets para android
- WebSockets para Android y aplicaciones de iOS
- Tiempo de espera del cliente websocket android
- Configurar un cliente Stomp en android con el marco de Spring en el lado del servidor
- Websocket Server Android
- WebSocket en Android WebView
Es completamente posible que Angular.js esté haciendo dos $ scope. Basta con ver la depuración en este screencast .
Puede ayudar a mostrar todos los $ escopos en la página .
También debe ser consciente de que los websockets en móviles no son la mejor idea . Los choques y los fracasos parecen ser bastante probables, basados en esa charla (por un empleado de Nodejitsu con experiencia en websockets).