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线程分派更新自己的位置。