【问题标题】:Accessing local objects of another method访问另一个方法的本地对象
【发布时间】:2013-06-02 09:44:11
【问题描述】:

我基本上是在使用我的 android 应用程序的位置进行测试。它目前所做的只是显示一些带有用户位置纬度和经度的 TextView。但是,我希望 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 可能尚未初始化”。无论如何我可以做到这一点吗?

【问题讨论】:

    标签: java android


    【解决方案1】:

    将 locationManager 设为类变量和最终变量,以便您可以从类中的任何位置引用它。

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

    【讨论】:

    • Aaaarrrrhhhhhgggg。我的眼睛快要从眼眶里掉出来了。我的鼻子在融化,我的狗在嚎叫。 “全球”疾病仍然存在。这不是一个全局变量,根据定义,它的范围和生命周期等于应用程序。这是一个类字段(或类变量)。 -1,直到你修复它。你从哪里得知一个类字段是全局的?请告诉我,这样我就可以在写它的人身上插入一些尖刻的东西!
    • 哈哈,感谢您在硅谷凌晨 3:00 让我振作起来。固定的! :)
    • 这是更好的方法还是使用其他评论中提到的 locationManager.removeUpdates(this)?
    • @cortex 都可以。这是风格问题。就个人而言,我更喜欢 ljgw 的回答,因为它限制了位置管理器的范围。良好的 OOP 设计要求一切都应具有尽可能小的范围。
    • @Simon 确实如此,但是在处理位置时,在现实场景中,您将经常与经理打交道,并且可能希望避免重复。 (如果我错了,请纠正我)。
    【解决方案2】:

    在我看来,您正在寻找的是在其方法之一中使用 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);
    } 
    

    【讨论】:

      【解决方案3】:

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

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

      现在您可以从课堂上的任何位置访问 mLocationManager。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多