Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每5分钟生成一个位置_Java_Android_Multithreading_Timer_Geolocation - Fatal编程技术网

Java 每5分钟生成一个位置

Java 每5分钟生成一个位置,java,android,multithreading,timer,geolocation,Java,Android,Multithreading,Timer,Geolocation,我正在尝试创建一个应用程序,每5分钟将用户的位置发送到数据库,之后用户将能够看到它。有几个限制: 如果用户未移动,请不要生成其他位置。我通过检查新位置到当前位置的距离是否超过1800M(我只使用精度低于900的位置,因此可能位置的无线电频率为1800) 如果我能根据我当前位置的准确度得到更好的位置,那么就使用它 因此,我现在将提供我的代码,我想知道您对它的看法,以及它是否可以做得更好,因为它不能完美地工作。如果您想要一个明确的问题:忽略我的代码,我如何实现我提到的这两点 代码如下: publ

我正在尝试创建一个应用程序,每5分钟将用户的位置发送到数据库,之后用户将能够看到它。有几个限制:

  • 如果用户未移动,请不要生成其他位置。我通过检查新位置到当前位置的距离是否超过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几乎不可能解决。首先,您应该编写那些其他分支并放置某种记录器,以便了解您的代码在做什么(因为它肯定没有做您认为它应该做的事情)

通过这种方式,您将能够了解问题所在:

  • 没有位置
  • 不够准确
  • 相同地址的不同位置

你的代码工作不正常怎么办?我在帖子底部说了“相同地址的复制”,当我在距离足够大的20公里的地方之间移动时,没有收到位置。我在20公里后才收到1个位置当你开车时,应用程序是否在前台运行?您正在使用LocationListener,其实例仅在封闭的活动或服务运行时有效。当您收集位置时,用户是否应始终让您的应用程序在前台运行?您必须使用PendingEvent来请求位置更新,以便操作系统可以将PIs发送到您的应用程序,该应用程序可由服务或广播接收器使用。由于您在接收位置时正在向db写入数据,因此必须使用服务,因为该服务的运行时间比广播接收器长。