2009-09-07 3 views
2

잠시 후 앱을 종료했다가 다시 열면 내 앱이 위치를 업데이트하지 않으며 언젠가는 업데이트하기 전에 오랜 시간 (약 5 분)이 소요됩니다. 어떻게 해결할 수 있습니까? 이것은 내 코드GPS가 닫히고 Android 앱을 닫은 후 위치를 업데이트하지 않습니다.

private LocationManager lm; 
private LocationListener locationListener; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  

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

    locationListener = new mLocationListener(); 

    lm.requestLocationUpdates(
     LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 


private class myLocationListener implements LocationListener 
{ 
    @Override 
    public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 
     TextView gpsloc = (TextView) findViewById(R.id.widget28); 
     gpsloc.setText("GPS OFFLINE."); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, 
     Bundle extras) { 
     // TODO Auto-generated method stub 
    } 
} 
+9

한 가지를 업데이트 할 수 바이더가 없음을 기회가있을 수 있습니다 : 당신이 정말로 onPause에서 위치 리스너를 등록 해제한다(). 그렇지 않으면 업데이트가 계속 유지되며 GPS는 아무 이유없이 계속 실행됩니다 (좋지 않음). 즉, onCreate()가 아니라 onResume()에 등록하십시오. – Matthias

+2

별도의 클래스가 필요하지 않습니다. 액티비티에 LocationListener 인터페이스를 구현시킨 다음 거기에서 메서드를 재정의 할 수 있습니다. – MattC

+0

Blow Link를 확인하십시오 .. 도움이 될 수도 있습니다 ... 위치 관리자가 위치 정보를 쉽게 업데이트 할 수 있도록 sach 인수를 전달해야하므로 위치를 얻는 것이 옳습니다 ... http : // developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates%28long,%20float,%20android.location.Criteria,%20android.app.PendingIntent%29 –

답변

7

몇 가지 ... 아마 앱이 다시 시작하고 "두 번째"시간을 만들지되고있다 무슨 일

입니다. 당신은 또한 당신이 당신의 LocationListener의 등록을 취소 할 수 있도록 할 것입니다

lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 0, 0, locationListener); } 

: 당신이 새로운 위치에 대한 활동이 볼 때마다보고 싶은 경우에 당신은 onResume() 방법에 다음 코드를 이동할 수 있습니다 onPause() 방법. 이런 식으로 뭔가 그것을 수행해야합니다 그것이 있어야

locationListener = new mLocationListener(); 

내가 생각 :

locationListener = new myLocationListener(); 

또한 다른 사람, 당신이 줄에 오타가 같은

@Override 
public void onPause() { 
    lm.removeUpdates(locationListener); 
    super.onPause(); 
} 

것 같습니다 앞서 언급했듯이, LocationListener로 작동 할 완전히 새로운 클래스를 만들 이유가 없습니다. 사실, 그것은 불필요하게 메모리를 태우고 모바일 장치의 메모리는 매우 중요합니다.

모든 일들의 조합 위의이 같은 뭔가를 찾고 활동을 떠날 것이다 :

public class Whatever extends Activity implements LocationListener { 
    private LocationManager lm; 
    private LocationListener locationListener; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  

     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
     locationListener = new mLocationListener(); 
    } 

    @Override 
    public void onResume() { 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this); 
     super.onResume(); 
    } 

    @Override 
    public void onPause() { 
     lm.removeUpdates(this); 
     super.onPause(); 
    } 

    @Override 
    public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     TextView gpsloc = (TextView) findViewById(R.id.widget28); 
     gpsloc.setText("GPS OFFLINE."); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 
    } 
} 
+0

"locationListener = new mLocationListener(); " 설명해 줘. 설명해 줄래? – systempuntoout

+0

오타였던 것 같습니다. 처음부터 'm'을 제거하십시오. –

0
u는 매우 fast..avoid이 당신의 배터리를 소모합니다 0 mintime 0 정밀도를 사용하는 이유

우선 그되지 필요성 유 여기에 언급 된 시간 지연 확실히 GPS 신호의 가용성에 따라 때로는 다를 수 있습니다 GPS 데이터에 액세스 할 수있는 GPS 칩 걸리는 시간이다 둘째

및 업데이트에 관한 u는이

을 시도해야하는 경우
public void onLocationChanged(Location loc) { 
     if (loc != null) { 
      TextView gpsloc = (TextView) findViewById(R.id.widget28); 
      gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude()); 
     } 
     else 
      {gpsloc.setText("provider not available");}//provider available or not 

    } 

이 위치를 눈치

관련 문제