Question

Qu'est-ce que j'essaie de faire:

1) Mettre à jour les informations de localisation d'un utilisateur toutes les minutes des X / P>

2) Utilisez une minuterie et une TIMERTASK pour appeler un service Web qui enregistre les informations de localisation les plus récentes

Qu'est-ce qui se passe:

1) Le TimerSk est créé

2) Si le téléphone de l'utilisateur est hibernant / dormant, l'appel au service Web ne fonctionne pas

3) Le système d'horlogerie semble être stocké dans une file d'attente

4) Lorsque le téléphone de l'utilisateur se réveille, tous les TIMERTâches en file d'attente s'exécutent immédiatement, ce qui entraîne plusieurs mises à jour de localisation indésirables contre le service Web

Voici l'extrait de code:

timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {

    try
    {
        //validate that the device has an active & working connection
        ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetwork = connMgr.getActiveNetworkInfo();

        //validate the the device network provider is enabled
        if ((eview_locationManagerwifi
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) && (activeNetwork != null && activeNetwork.getState() == NetworkInfo.State.CONNECTED))
        {
                UpdateSubscriberLocation(); // call the web service to report location data                                                 
        }
        else
        {
            this.cancel();
        }
    }
    catch (Exception e)
    {


    }

Les chèques de connectivité réseau et de fournisseur-Fournisseur sont apparemment à la fois de retourner avec "True", car le TimerSk ne s'annule pas, il est juste d'être mis en file d'attente jusqu'à ce que le téléphone de l'utilisateur se réveille.

Comment puis-je annuler le TIMERTASK si une certaine période est écoulée sans réponse du service Web? Je n'ai pas pu trouver une sorte de méthode "Settimeout" sur le TimerSk.

Était-ce utile?

La solution

N'utilisez pas le TIMERTASK, utilisez EmplacementManager.RequestLocalisationDates ().Cela n'addcend pas comme le TIMERTASK et il simplifie un peu le code.Vous bénéficiez également d'un avantage supplémentaire d'éviter les travaux si l'emplacement des utilisateurs ne change pas.

Autres conseils

Si vous avez besoin de mises à jour rapides, utilisez un wakelock pour empêcher les périphériques qui arrêtent la CPU.Voir ici pour plus de détails: http://developer.android.com/reference/andrroid/OS / POWERMANAGER.HTML

Si vous n'avez pas besoin de mises à jour rapides (disons que toutes les minutes utilisez l'alarmmanager. Si l'alarme est tirée, demandez une mise à jour de l'emplacement, envoyez vos données et définissez la prochaine alarme: http://developer.android.com/reference/andrroid/app/alarmmanager.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top