2009-09-07 6 views
2

Après avoir fermé mon application pendant un moment, puis rouvrir à nouveau, mon application ne mettra pas à jour l'emplacement ou parfois il faudra longtemps (environ 5min) avant la mise à jour. Comment puis-je le réparer? Ceci est mon codeGPS ne pas mettre à jour l'emplacement après la fermeture et rouvrir app sur android

private LocationManager lm; 
private LocationListener locationListener; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  

    lm = (LocationManager) 
     getSystemService(Context.LOCATION_SERVICE);  

    locationListener = new mLocationListener(); 

    lm.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 


private class myLocationListener implements LocationListener 
{ 
    @Override 
    public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 
     TextView gpsloc = (TextView) findViewById(R.id.widget28); 
     gpsloc.setText("GPS OFFLINE."); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, 
     Bundle extras) { 
     // TODO Auto-generated method stub 
    } 
} 
+9

Une chose que je remarque: vous devriez vraiment désenregistrer votre position d'écoute dans OnPause(). Sinon, il continuera à recevoir des mises à jour et le GPS continuera à fonctionner sans raison (pas bon). Cela étant dit, enregistrez-le dans onResume(), pas surCreate(). – Matthias

+2

Vous n'avez pas non plus besoin d'une classe séparée pour cela. Vous pouvez simplement faire en sorte que votre activité implémente l'interface LocationListener, puis remplacer les méthodes ici. – MattC

+0

Check Blow Link .. Peut-être que c'est vous aider ... Dans ce que vous devez passer l'argument sach afin que le gestionnaire de localisation peut facilement mettre à jour votre emplacement et votre code est également juste pour obtenir Lieu .... http: // developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates%28long,%20float,%20android.location.Criteria,%20android.app.PendingIntent%29 –

Répondre

7

Quelques choses ...

Ce qui se passe probablement est votre application est reprise et pas créé le temps « seconde ». Si vous voulez chercher un nouvel emplacement à chaque fois que l'activité est considérée, vous voulez déplacer le code suivant dans la méthode onResume():

lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 

Vous devrez également vous assurer que vous désenregistrez votre LocationListener en la méthode onPause(). Quelque chose comme ça devrait le faire:

@Override 
public void onPause() { 
    lm.removeUpdates(locationListener); 
    super.onPause(); 
} 

Il semble que vous avez une faute de frappe sur cette ligne:

locationListener = new mLocationListener(); 

Je pense qu'il devrait être:

locationListener = new myLocationListener(); 

En outre, comme quelqu'un d'autre mentionné, il n'y a aucune raison de créer une toute nouvelle classe pour agir en tant que LocationListener. En fait, il va inutilement brûler de la mémoire et sur la mémoire des appareils mobiles est une prime.

La combinaison de toutes les choses ci-dessus laisserait votre activité à la recherche quelque chose comme ceci:

public class Whatever extends Activity implements LocationListener { 
    private LocationManager lm; 
    private LocationListener locationListener; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  

     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
     locationListener = new mLocationListener(); 
    } 

    @Override 
    public void onResume() { 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this); 
     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     lm.removeUpdates(this); 
     super.onPause(); 
    } 

    @Override 
    public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     TextView gpsloc = (TextView) findViewById(R.id.widget28); 
     gpsloc.setText("GPS OFFLINE."); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

Je ne comprends pas ce que "locationListener = new mLocationListener(); " fait dans votre code. Pouvez-vous expliquer? – systempuntoout

+0

On dirait que c'était une faute de frappe. Retirez simplement le 'm' du début. –

0

première chose pourquoi u ont utilisé 0 mintime et 0 précision, il videra votre batterie très fast..avoid cette si ce ne est pas nécessaire
d'autre part le décalage temporel u mentionné ici est sans aucun doute le temps pris par la puce GPS pour accéder aux données GPS qui peut varier en fonction parfois sur le signal GPS disponibilité
et en ce qui concerne la mise à jour u devrait essayer

public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
     else 
      {gpsloc.setText("provider not available");}//provider available or not 

    } 

il pourrait y avoir une chance qu'il n'y a aucun fournisseur disponible pour mettre à jour l'emplacement

Questions connexes