[ 
https://issues.apache.org/jira/browse/CB-3901?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Bas Bosman updated CB-3901:
---------------------------

    Component/s: Plugin Geolocation

> Backlog of Acceleration messages are received after plugin/sensor is stopped
> ----------------------------------------------------------------------------
>
>                 Key: CB-3901
>                 URL: https://issues.apache.org/jira/browse/CB-3901
>             Project: Apache Cordova
>          Issue Type: Improvement
>          Components: Android, CordovaJS, Plugin Geolocation
>    Affects Versions: 2.7.0
>            Reporter: Peter
>            Assignee: Joe Bowser
>            Priority: Minor
>
> There is a kind of race condition between the Accelerometer events being 
> generated and the processing of the Cordova bridge messages.
> For example:
> In the plugin:
> * Accelerometer events are generated at a rapid rate.
> * The event always results in data transfer across the bridge. e.g. 
> onSensorChanged calls this.win() calls sendPluginResult…
> * So very quickly lots of PluginResult messages will be queued, requiring 
> processing
> Meanwhile in the JavaScript:
> * callbackFromNative handles the incoming messages and if there are any 
> listeners then it deals with the acceleration event.
> * When it determines there are no user listeners left then a sensor “stop” 
> will be issued 
> But even after the “stop” is executed, there is still a potentially large 
> backlog of queued acceleration messages still remaining to be processed. 
> Since there are no user listeners left the user does not get to see them – 
> they so just end up going nowhere.
> I don’t know whether there is anything possible that can be done about this 
> (it seems to be just the way it is designed) but perhaps there should be some 
> comment in the code for the accelerometer callbacks to describe how they may 
> be called even though all user listeners have been removed. And maybe the 
> success function can be modified to not bother constructing the Acceleration 
> instance unless it will be used. Something like this?
> BEFORE:
> {code}
> function(a) {
>    var tempListeners = listeners.slice(0);
>    accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
>    for (var i = 0, l = tempListeners.length; i < l; i++) {
>        tempListeners[i].win(accel);
>    }
> }
> {code}
> AFTER:
> {code}
> function(a) {
>     // NB: It is possible for this callback to be executed even after the 
> accelerometer 
>     // sensor is “stopped” due to a backlog of unprocessed acceleration 
> messages.
>     var tempListeners = listeners.slice(0);
>     var nListeners = tempListeners.length;
>     if (nListeners > 0) {
>         accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
>         for (var i = 0, l = nListeners; i < l; i++) {
>             tempListeners[i].win(accel);
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

Reply via email to