Java 每5分钟生成一个位置
我正在尝试创建一个应用程序,每5分钟将用户的位置发送到数据库,之后用户将能够看到它。有几个限制:Java 每5分钟生成一个位置,java,android,multithreading,timer,geolocation,Java,Android,Multithreading,Timer,Geolocation,我正在尝试创建一个应用程序,每5分钟将用户的位置发送到数据库,之后用户将能够看到它。有几个限制: 如果用户未移动,请不要生成其他位置。我通过检查新位置到当前位置的距离是否超过1800M(我只使用精度低于900的位置,因此可能位置的无线电频率为1800) 如果我能根据我当前位置的准确度得到更好的位置,那么就使用它 因此,我现在将提供我的代码,我想知道您对它的看法,以及它是否可以做得更好,因为它不能完美地工作。如果您想要一个明确的问题:忽略我的代码,我如何实现我提到的这两点 代码如下: publ
- 如果用户未移动,请不要生成其他位置。我通过检查新位置到当前位置的距离是否超过1800M(我只使用精度低于900的位置,因此可能位置的无线电频率为1800)
- 如果我能根据我当前位置的准确度得到更好的位置,那么就使用它
public void onStart(Intent intent, int startId)
{
...
this.timer.scheduleAtFixedRate(new Send(), d1, TEN_MINUTES/2);
}
...
if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TEN_MINUTES/2, 0, listener);
if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, TEN_MINUTES/2, 0, listener);
...
@Override
public void onLocationChanged(Location location)
{
handleLocation(location);
}
private void handleLocation(Location location)
{
if(isUsable(location))
{
this.isUsable = true;
this.newLocation = location;
}
}
public boolean isUsable(Location location)
{
if (mGeocoderAvailable)
{
this.address = reverseGeocode(location);
return location.hasAccuracy() && location.getAccuracy() < 900 && !this.address.equals("");
}
return false;
}
class Send extends TimerTask
{
boolean run = true;
@SuppressWarnings("deprecation")
public void run()
{
if(isUsable)
{
isUsable = false;
if(newLocation != null)
{
if(location != null)
{
if(location.getAccuracy() > newLocation.getAccuracy() + 100)
sendTask();
else
if(newLocation.distanceTo(location) > 1800)
sendTask();
}
else
sendTask();
}
}
}
}
另一件事是,我用我的手机开了20公里的车,但我在数据库中没有收到任何位置信息,只有当我完成驾驶(20公里后) 首先,您可能希望有一个可变的不确定性需求 其次,这是启动计时器的命令
public void onStart(Intent intent, int startId)
{
...
this.timer.scheduleAtFixedRate(new Send(), d1, TEN_MINUTES/2);
}
this.timer.scheduleAtFixedRate(new Send(), d1, 5, TimeUnits.MINUTES);
这个命令不对。在将Send发送到计时器之前,您可能还需要创建一个Send实例
public void onStart(Intent intent, int startId)
{
...
this.timer.scheduleAtFixedRate(new Send(), d1, TEN_MINUTES/2);
}
this.timer.scheduleAtFixedRate(new Send(), d1, 5, TimeUnits.MINUTES);
在你开车之前,我建议你在你的测试环境中更频繁地测试它的关键部分。将时间设置为每10秒一次,并检查以确保其工作正常、数学正确、报告位置等
最后,添加的方法如下:
if(newLocation != null)
{
if(location != null)
{
if(location.getAccuracy() > newLocation.getAccuracy() + 100)
sendTask();
else
if(newLocation.distanceTo(location) > 1800)
sendTask();
}
else
sendTask();
}
首先,您不应该使用else。在这种情况下,您应该将所有if语句合并到一个公共主题中。我也不太确定它从哪里获取位置/新位置,您可能应该为它们创建获取函数,如果它们是线程安全的,那么可以获得额外的积分。而且,这可能是关键,您总是在执行sendTask
,如果没有有效的位置,我怀疑这是您的关键错误。尝试用以下代码替换该代码:
if (location!=null
&& ((location.getAccuracy() > newLocation.getAccuracy() + 100)
&& newLocation.distanceTo(location) > 1800)
{
sendTask();
}
你有那么多的IF语句和那么少的else语句,这使得你的bug几乎不可能解决。首先,您应该编写那些其他分支并放置某种记录器,以便了解您的代码在做什么(因为它肯定没有做您认为它应该做的事情) 通过这种方式,您将能够了解问题所在:
- 没有位置
- 不够准确
- 相同地址的不同位置