1

Dans mon application, j'utilise ReactiveLocationProvider pour obtenir des mises à jour de l'emplacement d'arrière-plan. (bibliothèque link) Lorsque mon application est réduite (entre dans OnPause), elle commence à recevoir des mises à jour. Cela fonctionne très bien, mais le problème est que je ne veux pas de mises à jour fréquentes. Par exemple, dans mon code j'ai un LocationRequest qui est supposé pour obtenir la mise à jour de l'emplacement (un) lorsque l'utilisateur se déplace 1km et au moins 10 minutes (setFastestInterval) ont passé. Selon mon journal, je reçois plus de mises à jour que nécessaire. Quelqu'un sait pourquoi?Mise à jour des emplacements trop fréquents en arrière-plan

c'est mon code dans mon MainActivity sur méthode de création:

public class MainActivity extends AppCompatActivity { 
LocationRequest request; 
ReactiveLocationProvider locationProvider; 
Subscription subscription; 
Subscription onlyFirstTimeSubscription; 
NotAbleToGetWeatherDataTask mNotAbleToGetWeatherDataTask = new NotAbleToGetWeatherDataTask(); 
int numOfBackgroundUpdates = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //-----------MY CODE STARTS HERE----------------- 
    request = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY) 
      .setSmallestDisplacement(1000) 
      .setFastestInterval(10 * 1000) 
      .setInterval(30 * 60 * 1000); 
    locationProvider = new ReactiveLocationProvider(this); 
} 

et ma méthode OnPause:

@Override 
protected void onPause() { 
    super.onPause(); 
    //subscribe for background location updates... 
    subscription = locationProvider.getUpdatedLocation(request) 
      .subscribe(new Action1<Location>() { 
       @Override 
       public void call(Location location) { 
        Log.d(TAG, "Getting Background updates..."); 
        MainActivity.this.latitude = location.getLatitude(); 
        MainActivity.this.longitude = location.getLongitude(); 
        numOfBackgroundUpdates++; 

       } 
      }); 
} 

et je suis le désabonnement de la demande détruire:

@Override 
protected void onDestroy() { 
    Log.d(TAG, "OnDestroy Called!"); 
    subscription.unsubscribe(); 
    super.onDestroy(); 
} 

journal récent (j'ai déménagé 1km et au moins 10 minutes se sont écoulées)

12-28 17:12:25.564 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.918 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.924 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.925 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.927 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.928 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.930 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.931 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.940 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.942 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.942 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.946 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.949 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:06.951 29845-29845/? D/MainActivity: Getting Background updates... 
12-28 17:16:40.371 29845-29845/? D/MainActivity: Getting Background updates... 
+1

avez-vous enregistré plus d'une demande? – Blackbelt

+0

J'ai, mais je suis immédiatement la désinscription quand je reçois l'endroit comme ça: LocationRequest oneTimeOnStartRequest = LocationRequest.create() .setPriority (LocationRequest.PRIORITY_HIGH_ACCURACY) ... @Override appel public void (Lieu lieu) { Log.d (TAG, "Obtention des premières mises à jour de localisation ..."); .. onlyFirstTimeSubscription.unsubscribe(); } }); –

+1

Faites un brin avec le code complet, s'il vous plaît – Blackbelt

Répondre

1

régler d'abord ceci:
Votre setFastestInterval en ms est 10 * 1000 -> pendant 10 minutes, vous devez faire ceci: 60 * 10 * 1000

Puis un coup d'oeil à ceci:
Vous devez créer un instance de votre classe de fournisseur de localisation pour la durée de votre application:

Si vous regardez these links au ReaciveLocationProvider Vous verrez passer le contexte actuel en tant que paramètre.

ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(context); 
locationProvider.getLastKnownLocation() 
.subscribe(new Action1<Location>() { 
    @Override 
    public void call(Location location) { 
     doSthImportantWithObtainedLocation(location); 
    } 
}); 

reactiveLocationProvider = new ReactiveLocationProvider(this); 

L'auteur passe le contexte en paramètre. Je vous suggère de parcourir toutes vos instances du reactiveLocationProvider et de créer une instance unique. Créez donc un contexte final statique, en utilisant getapplicationcontext, ou une méthode similaire comme suggéré ci-dessous.

exemple: (cela est pris de ma bibliothèque

LocationManager locationManager = (LocationManager) getSystemService(_CONTEXT); 

Exemple dans ma classe personnalisée Je passe un contexte final:

public class LocFinder extends Service implements LocationListener { 
    private final Context mContext; 

    public LocFinder(Context context) { 
     this.mContext = context; 
    } 

Sans examiner le code GitHub plus à fond, il est difficile de Indiquez si l'auteur s'est bien gardé de cela, mais si vous l'appelez de MainActivity dans oncreate comme ça, alors vous pourriez créer une nouvelle requête

request = LocationRequest.create() 

Vous demandez aussi l'emplacement sur OnPause:

MainActivity.this.latitude = location.getLatitude(); 
MainActivity.this.longitude = location.getLongitude(); 

Je ne suis pas 100% clair sur la nécessité de le faire.

Prenez également note de l'utilisation par l'auteur original de final lors de la création d'une demande d'emplacement.Qui soutient l'idée de contrôler votre demande appelle la durée de vie de l'application.

Crier si vous avez besoin de plus d'aide.

+0

Je n'utilise pas le gestionnaire de position. Il est là juste pour utiliser sa méthode pour vérifier si le service de localisation est activé. J'utilise la bibliothèque ReactiveLocationProvider pour mes mises à jour/demandes d'emplacement –

+0

@GeorgiKoemdzhiev Je vais jeter un oeil, mais il sera lié à cela. Laissez-moi voir ce qui doit être fait. brb –

+0

Merci beaucoup! :) –