1

我想開發基於位置的提醒應用程序。因此,我想使用android服務獲取當前位置,即使應用程序沒有運行。但我沒有這樣做。我在android服務類中設置了計時器,但我不知道如何獲取服務類中的當前位置。問題是什麼 ?我得到了一些錯誤是這樣的:從Android獲取當前位置後臺服務問題

不能創建內螺紋處理程序尚未調用looper.prepare()

public class TrackerService extends Service { 

    double latShared; 
    double lngShared; 
    double latService; 
    double lngService; 
    private LocationManager lm; 
    Timer timer; 
    Handler handler; 
    final static long TIME = 15000; 
    SharedPreferences mSharedPrefs; 
    SharedPreferences.Editor mPrefsEditor; 



    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE); 
     latShared = (double)mSharedPrefs.getFloat("lat", 0); 
     lngShared = (double)mSharedPrefs.getFloat("lng", 0); 
     timer = new Timer(); 
     timer.schedule(new TimerTask(){ 
      @Override 
      public void run(){ 
       LocationUpdates(); 
      } 
     },0,TIME); 

    }  

    public void LocationUpdates(){ 
     locListener locList = new locListener(); 
     lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList); 
    } 

    @Override 
    public void onDestroy() { 
     //lm.removeUpdates(this); 
     timer.cancel(); 
    } 

    public class locListener implements LocationListener{ 

     @Override 
     public void onLocationChanged(Location location) { 
      latService = location.getLatitude(); 
      lngService = location.getLongitude(); 
     } 

     @Override 
     public void onProviderDisabled(String provider) {} 

     @Override 
     public void onProviderEnabled(String provider) {} 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 


    } 

} 
+0

你可以像onResume()中的位置更新請求一樣使用調用請求,並在onpause()內部刪除更新調用。 – 2013-05-12 09:01:36

回答

1

LocationManager.requestLocationUpdates應該爲sibling方法上UI線程運行定義。另一方面,TimerTask引入了一個新的線程來卸載它的執行。

但是,如果你不使用的新工藝爲您服務,然後只需如下調用LocationUpdates()

@Override 
protected void onCreate() { 
    mSharedPrefs = getSharedPreferences("locationXML", MODE_PRIVATE); 
    latShared = (double)mSharedPrefs.getFloat("lat", 0); 
    lngShared = (double)mSharedPrefs.getFloat("lng", 0); 

    final Handler h = new Handler(); 
    h.post(new Runnable() { 
     @Override 
     public void run() { 
      LocationUpdates(); 
      h.postDelayed(this, TIME); 
     } 
    }); 
} 

OR,如果你不希望使用的處理程序,然後簡單地升級requestLocationUpdates爲如下:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList, getMainLooper()); 

在上述情況下,getMainLooper()將從UI線程分派更新自己的位置。