我无法获得mlocManager.removeUpdates(mlocListener);上班

时间:2011-02-01 13:29:49

标签: android locationlistener

我有一个使用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();    
        }
    }
}

我总是得到“不杀”的消息。

任何人都可以帮助我!

4 个答案:

答案 0 :(得分:1)

在您提供的代码中,您在类的顶部声明了模块级变量,并且您希望将它们设置为位置管理器和侦听器。但是,在onCreate中,您将声明新的私有变量恰好与模块级变量具有相同的名称。一旦onCreate完成执行,这些变量就会从堆栈中取出,因此你的模块级变量为null,因为它们从未被初始化。赛斯的改变将解决问题。

答案 1 :(得分:0)

更改此

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

        LocationListener mlocListener = new MyLocationListener();

到此

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

            mlocListener = new MyLocationListener();

很抱歉不知道为什么会这样,但它确实有用。

答案 2 :(得分:0)

这是一个范围问题。在onCreate函数中,您将声明仅存在于此函数中的新变量mlocManager和mlocListener,并且在其他任何位置都无法看到。不要将类型放在您已声明的参数前面,因为这样您实际上隐藏了类变量。你现在的方式是调用removeUpdates(mLocListener),而不是你在onCreate中使用的对象上调用它。

答案 3 :(得分:-2)

我可以通过改变

来解决这个问题
private LocationManager mlocManager;
private LocationListener mlocListener;  

private LM mlocManager;
private LL mlocListener;

并添加

LM = mlocManager;
LL = mlocListener;

然后将所有后来的引用更改为mlocManagerLMal引用或mlocListenerLL

虽然这很有效但看起来很笨拙。我相信有更好的方法吗?