访问另一种方法的本地对象

时间:2013-06-02 09:44:12

标签: java android

我基本上测试使用我的Android应用程序的位置。它目前所做的只是显示一些TextViews,其中包含用户位置的纬度和经度。但是,我希望LocationListener在收到位置后停止接收更新,而不是继续监听更新。

public void updateLocation(Location location, Geocoder geocoder){
    TextView lat=(TextView)getView().findViewById(R.id.lat);
    TextView longt=(TextView)getView().findViewById(R.id.longt);    
    double lata=location.getLatitude();
    double longa=location.getLongitude();
    lat.setText(Double.toString(location.getLatitude()));
    longt.setText(Double.toString(location.getLongitude()));
}

public void FindLocation(Context context){
    final LocationManager locationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener(){
          public void onLocationChanged(Location location){
        updateLocation(location);}
          public void onStatusChanged(String provider, int status, Bundle extras) {}
          public void onProviderEnabled(String provider) {}
          public void onProviderDisabled(String provider) {}
      };
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
} 
}

这应该在调用updateLocation()之后完成,但是它不能引用locationManager和locationListener。在updateLocation()被称为'无法引用在另一个方法中定义的内部类中的非最终变量locationListener'之后,我也无法在FindLocation()内调用它。但是,将final添加到locationListener只会产生错误'locationListener可能尚未初始化'。无论如何我能做到这一点吗?

3 个答案:

答案 0 :(得分:2)

使locationManager成为一个类变量和final,这样你就可以从类中的任何地方引用它。

private final LocationManager locationManager;

然后在onCreate中定义它,如下所示:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);



locationManager =(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener(){
      public void onLocationChanged(Location location){
    updateLocation(location);}
      public void onStatusChanged(String provider, int status, Bundle extras) {}
      public void onProviderEnabled(String provider) {}
      public void onProviderDisabled(String provider) {}
  };
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}

答案 1 :(得分:0)

将它设为类的私有字段,如下所示:

private LocationManager mLocationManager;
public void FindLocation(Context context){
    mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
...
}

现在您可以从班级的任何地方访问mLocationManager。

答案 2 :(得分:0)

对我来说,你要找的是在其中一个方法中使用locationListener本身。你可以用'this'来做到这一点。

public void FindLocation(Context context){
    final LocationManager locationManager (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    LocationListener locationListener = new LocationListener(){
        public void onLocationChanged(Location location){
            updateLocation(location);
            locationManager.removeUpdates(this);
        }
        public void onStatusChanged(String provider, int status, Bundle extras) {}
        public void onProviderEnabled(String provider) {}
        public void onProviderDisabled(String provider) {}
    };
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}