2011-02-01 3 views
1

У меня есть приложение, которое использует функции LocationManage, которые хорошо работают, пока приложение не остановится или не приостановится. Функция прослушивания местоположения по-прежнему выполняется в фоновом режиме. Соответствующие биты кода следуют. Когда я нажимаю на кнопку «домой» или «назад», функция onstop() запускается правильно.Я не могу получить mlocManager.removeUpdates (mlocListener); для работы

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

Я всегда получаю сообщение «не убивать».

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

+0

в вашей функции onCreate вы объявляете новую переменную mlocManager и mlocListener. Не ставьте тип перед параметром, потому что тогда вы не используете тот, который объявлен в классе (сверху onCreate). –

ответ

-2

я могу обойти это путем изменения

private LocationManager mlocManager; 
private LocationListener mlocListener; 

в

private LM mlocManager; 
private LL mlocListener; 

и добавление

LM = mlocManager; 
LL = mlocListener; 

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

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

+0

Что такое LM и LL? Вы объявляли эти классы где-то? это совершенно неправильно. –

0

Изменить этот

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

     LocationListener mlocListener = new MyLocationListener(); 

Для этого

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

      mlocListener = new MyLocationListener(); 

К сожалению, не имеют ни малейшего представления, почему это так, но это работает.

1

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

0

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