我目前正在编写一个应用程序,每分钟(或其他指定的时间)接收位置数据,并将其发送到服务器。
我注意到的问题是: 当我使用连接到电源的应用程序时,它可以完美地工作 - 以定义的间隔发送更新。 当我在电池上使用时,它会随机发送更新。
对于我的应用程序,我使用计时器来指定更新间隔。此计时器在后台服务中运行。我在计时器中请求更新,并在收到位置时删除更新。 我的代码片段:
private class mainTask extends TimerTask
{
public void run()
{
toastHandler.sendEmptyMessage(0);
}
}
private final Handler toastHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
date = date.getInstance(); //used to set time of update.
if(!GPSupdating)
{
locationManager.requestLocationUpdates("gps", 0, 0, locationListenerGPS);
GPSupdating = true;
}
}
};
我的位置听众:
LocationListener locationListenerGPS = new LocationListener()
{
public void onLocationChanged(Location updatedLocation)
{
myGPSLocation = updatedLocation;
haveLocationGPS = true;
locationManager.removeUpdates(locationListenerGPS);
GPSupdating = false;
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
你知道为什么这不能正常工作吗?
答案 0 :(得分:0)
这不是一个好的解决方案 - 每分钟启用/禁用监听器。
最好尝试以下事项:
1)将最小更新时间(在requestLocationUpdates中)设置为一分钟,并将数据发送到更新侦听器中的服务器:
locationManager.requestLocationUpdates("gps", 60*1000, 0, locationListenerGPS);
如果您需要更准确的更新间隔,请执行以下操作:
2)启动单独的线程并在其上启用GPS更新。将最后位置存储在线程或服务变量中。同时启动计时器和计时器滴答发送位置到服务器。
答案 1 :(得分:0)
尝试使用Criteria来管理电源。将电源要求设置为POWER_LOW。你会失去一些准确性。
LocationManager locationManager= (LocationManager) getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_LOW);
provider = locationManager.getBestProvider(criteria, true);
答案 2 :(得分:0)
通过每分钟启用和禁用一次GPS,您将无法节省能源。要么选择更大的间隔(5分钟),要么选择第二个位置
然后将该位置存储在lastValidLocation
字段中,启动您自己的计时器,并每分钟读出一次lastValidLocation
。如果更改,则发送到服务器。