Я не могу получить mlocManager.removeUpdates (mlocListener); работать - PullRequest
1 голос
/ 01 февраля 2011

У меня есть приложение, которое использует функции LocationManage, которые работают хорошо, пока приложение не будет остановлено или приостановлено.Функция прослушивания местоположения все еще продолжается в фоновом режиме.Соответствующие биты кода следуют.Когда я нажимаю home или back, функция onstop () срабатывает корректно.

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();    
        }
    }
}

Я всегда получаю сообщение "not kill".

Может ли кто-нибудь мне помочь!

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

В коде, который вы дали, вы объявляете переменные уровня модуля в верхней части вашего класса и хотите, чтобы они были установлены для менеджера местоположений и слушателя.Однако в onCreate вы объявляете новые закрытые переменные, имена которых совпадают с именами переменных уровня модуля.Эти переменные удаляются из стека после завершения выполнения onCreate, поэтому у вас остаются нулевые переменные уровня модуля, потому что они никогда не инициализировались.Изменение Сета решит проблему.

0 голосов
/ 16 октября 2012

Это проблема с ограничениями.В вашей функции onCreate вы объявляете новые переменные mlocManager и mlocListener, которые живут только внутри этой функции и больше нигде не видны.Не помещайте тип перед параметрами, которые вы уже объявили, потому что тогда вы фактически скрываете свои переменные класса.То, как вы сделали это сейчас, вызов removeUpdates (mLocListener) вызывается для объекта, отличного от того, который вы используете в onCreate.

0 голосов
/ 05 апреля 2011

Изменить это

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

        LocationListener mlocListener = new MyLocationListener();

К этому

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

            mlocListener = new MyLocationListener();

Извините, понятия не имею, почему так, но работает.

0 голосов
/ 02 февраля 2011

Я могу обойти это, изменив

private LocationManager mlocManager;
private LocationListener mlocListener;  

до

private LM mlocManager;
private LL mlocListener;

и добавление

LM = mlocManager;
LL = mlocListener;

Затем изменение всех последующих ссылок на mlocManager на LM и al ссылки или mlocListener на LL.

Хотя это работает, это кажется очень неуклюжим. Я уверен, что есть лучший способ?

...