2011-02-01 1 views
1

J'ai une application qui utilise les fonctions de LocationManage qui fonctionne bien jusqu'à ce que l'application soit arrêtée ou en pause. La fonction d'écouteur de localisation continue à fonctionner en arrière-plan. Les bits de code pertinents suivent. Lorsque je clique sur la page d'accueil ou de retour, la fonction onstop() est déclenchée correctement.Je n'arrive pas à obtenir mlocManager.removeUpdates (mlocListener); pour travailler

package uk.cr.anchor; 

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.media.MediaPlayer; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TableRow; 
import android.widget.Toast; 
import android.widget.ToggleButton; 
import android.content.SharedPreferences; 
import android.graphics.Color; 

public class main extends Activity { 

    /** Called when the activity is first created. */ 


    private LocationManager mlocManager; 
    private LocationListener mlocListener; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     LocationListener mlocListener = new MyLocationListener(); 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
} 
    @Override 
    protected void onStop(){ 


     stoplistening(); 
     super.onStop(); 
    } 

/* Class My Location Listener */ 

public class MyLocationListener implements LocationListener 
{ 


    @Override 

    public void onLocationChanged(Location loc) 
    { 

     loc.getLatitude(); 

     loc.getLongitude(); 

     etc etc etc 
    } 
    private void stoplistening() { 
     if (mlocManager != null) { 
      Toast.makeText(getApplicationContext(), 
       "kill", 
       Toast.LENGTH_SHORT).show(); 
      mlocManager.removeUpdates(mlocListener); 
     } 
     else { 
      Toast.makeText(getApplicationContext(), 
       " not kill", 
       Toast.LENGTH_SHORT).show();  
     } 
    } 
} 

Je reçois toujours le message «ne pas tuer».

Quelqu'un peut-il m'aider!

+0

Dans votre fonction onCreate, vous déclarez une nouvelle variable mlocManager et mlocListener. Ne mettez pas le type devant le paramètre car vous n'utilisez pas celui déclaré dans la classe (par dessus onCreate). –

Répondre

-2

Je peux contourner en changeant

private LocationManager mlocManager; 
private LocationListener mlocListener; 

à

private LM mlocManager; 
private LL mlocListener; 

et en ajoutant

LM = mlocManager; 
LL = mlocListener; 

Puis, changeant toutes les références plus tard à mlocManager à LM et al références ou mlocListener à LL.

Bien que cela fonctionne, il semble très maladroit. Je suis sûr qu'il y a un meilleur moyen?

+0

que sont LM et LL? Avez-vous déclaré ces classes quelque part? c'est totalement faux. –

0

Modifier cette

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

     LocationListener mlocListener = new MyLocationListener(); 

Pour ce

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

      mlocListener = new MyLocationListener(); 

Désolé ne pas idée pourquoi il est de cette façon, mais cela fonctionne.

1

Dans le code que vous avez donné, vous déclarez les variables de niveau module en haut de votre classe et vous souhaitez qu'elles soient définies sur un gestionnaire d'emplacement et un écouteur. Dans onCreate, cependant, vous déclarez que les nouvelles variables privées ont le même nom que les variables au niveau du module. Ces variables sont retirées de la pile une fois onCreate a fini de s'exécuter, donc il ne vous reste plus que vos variables au niveau du module, car elles n'ont jamais été initialisées. Le changement de Seth réglera le problème.

0

Ceci est un problème de portée. Dans votre fonction onCreate, vous déclarez les nouvelles variables mlocManager et mlocListener qui ne vivent que dans cette fonction et ne peuvent être vues nulle part ailleurs. Ne mettez pas le type devant les paramètres que vous avez déjà déclarés, car alors vous cachez effectivement vos variables de classe. La façon dont vous l'avez fait maintenant appel à removeUpdates (mLocListener) est appelée sur un objet différent de celui que vous utilisez dans onCreate.

Questions connexes