我有一个使用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();
}
}
}
我总是得到“不杀”的消息。
任何人都可以帮助我!
答案 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;
然后将所有后来的引用更改为mlocManager
到LM
和al
引用或mlocListener
到LL
。
虽然这很有效但看起来很笨拙。我相信有更好的方法吗?