2013-06-02 4 views
0

기본적으로 안드로이드 애플 리케이션의 위치를 ​​사용하여 테스트하고 있습니다. 현재 사용자 위치의 위도와 경도를 나타내는 일부 TextView가 표시됩니다. 그러나 LocationListener가 업데이트 수신을 계속하지 않고 Location 수신자가 위치를 수신 한 후에 업데이트 수신을 중지하기를 원합니다.다른 메서드의 로컬 객체에 액세스

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가 초기화되지 않았을 수 있습니다.'오류 만 발생합니다. 어쨌든 내가 이걸 이룰 수 있니?

답변

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

는 다음과 같이, 그 클래스의 private 필드 확인 :

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

지금 당신이 수업 시간에 어디서나 mLocationManager에 액세스 할 수 있습니다.

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

Aaaarrrhhhhhgggg. 내 눈이 그들의 소켓에서 떨어지고있다. 내 코가 녹고 내 개가 울부 짖고있다. "전 지구 적"질병은 여전히 ​​여기 있습니다. 이것은 전역 변수가 아니며 정의 상 범위와 수명이 응용 프로그램과 동일합니다. 이것은 클래스 필드 (또는 클래스 변수)입니다. -1 당신이 고칠 때까지. 수업 분야가 세계적이라는 것을 어디에서 알게 되었습니까? 누구든지 뾰족한 것을 삽입 할 수 있도록 말해주세요! – Simon

+0

하하, 실리콘 밸리에서 새벽 3시에 나를 응원 해 주셔서 감사합니다. 결정된! :) – kushyar

+0

다른 의견에서 언급 한 것처럼 더 나은 접근 방식이거나 locationManager.removeUpdates (this)를 사용 하시겠습니까? – cortex

관련 문제