[英]Get Current Location From Android Background Service Issue
我想開發基於位置的提醒應用程序。 因此,即使應用未運行,我也想使用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) {}
}
}
根據其同級方法定義, LocationManager.requestLocationUpdates
應該在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);
}
});
}
或 ,如果您不想使用處理程序,則只需升級您的requestLocationUpdates
,如下所示:
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList, getMainLooper());
在上述情況下, getMainLooper()
將通過UI線程調度您的位置更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.