我正在处理的Android应用程序要求每15分钟记录一次GPS位置。为了最大限度地减少GPS使用以保持电池寿命,我想使用ScheduledExecutorService开始请求位置更新,然后在发生位置更改后关闭请求。由于错误,我当前的实现不允许这样做:
Can't create handler inside thread that has not called Looper.prepare()
我知道的是因为我无法在后台线程中进行LocationManager调用。
启动调度程序的代码:
locationFinder = new LocationFinder(context);
final Runnable gpsBeeper = new Runnable()
{
public void run()
{
try {
locationFinder.getLocation();;
}
catch (Exception e)
{
Log.e(TAG,"error in executing: It will no longer be run!: " + e.getMessage());
e.printStackTrace();
}
}
};
gpsHandle = scheduler.scheduleAtFixedRate(gpsBeeper, 0, 15, MINUTES);
LocationFinder类:
public LocationFinder(Context context)
{
this.mContext = context;
}
public void getLocation()
{
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (isGPSEnabled)
{
try
{
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, updateInterval, distance, this);
}
catch (SecurityException s)
{
s.printStackTrace();
}
}
}
public void stopUpdates(){
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
isGPSUpdated = true;
stopUpdates();
}
如何在不依赖主线程调用requestLocationUpdates的情况下执行此操作?
答案 0 :(得分:1)
您的设置遇到的问题是,如果应用被操作系统杀死或用户滑动应用关闭它,它将停止记录您的位置更新。实际上,无论应用程序的状态如何,您都可以采用2种方法来获得定时更新间隔(除非应用程序被强制杀死)。
使用LocationManager
的requestLocationUpdates()
方法将更新间隔设置为15分钟,使用PendingIntent
代替LocationListener
来确保您继续接收更新,而无需持有对侦听器的引用。如果您需要知道是否已经请求更新,只需使用SharedPreferences
来保留布尔标志。
另一个是使用AlarmManager
来安排将调用IntentService
(用于在后台运行)或BroadcastReceiver
(用于在前台运行)的更新致电LocationManager
requestSingleUpdate()
方法以获取GPS更新。