gpt4 book ai didi

android - Android 中后台服务的位置跟踪问题

转载 作者:行者123 更新时间:2023-11-30 03:54:09 25 4
gpt4 key购买 nike

详细信息:

我有一项服务需要执行以下操作:- 不断监听 GPS 位置,以 50 米为参数(工作正常)并将其发送到服务器- 每 60 秒,如果没有读取 GPS 位置,则开始监听网络位置并将其发送到服务器

这听起来很奇怪,但这是项目要求。因此,用户会不断地使用 GPS 进行跟踪。当他停下来,或 GPS 未锁定,或在建筑物内时,每 60 秒开始快速读取网络位置,并将此位置发送到服务器。由于该服务使用与主应用程序相同的线程,因此每个服务器更新都在其自己的线程中完成。另一件重要的事情是:每个位置读取都应该一个接一个地发送,例如,如果用户正在开车,并且进行了多次读取,则每个位置都应该在前一个发送之后发送到服务器。这就是我决定使用 ScheduledExecutorService 的原因,因为我可以提交线程,它们将一个接一个地执行。

代码如下:

private ScheduledExecutorService scheduleTaskExecutor;
Handler locationHandler = new Handler();
private Location lastNetworkLocation;

@Override
public void onStartCommand() {
scheduleTaskExecutor = Executors.newSingleThreadScheduledExecutor();

//prepare to execute Network reading every 60 seconds
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
initNetworkReadings();

//usually a network location read is done almost instantly
//however after 5 seconds I check if a location has been read by the Network listener inside the locationRunnable
locationHandler.postDelayed(locationRunnable, 5000);
}

}
}, 60, 60, TimeUnit.SECONDS);

locationRunnable = new Runnable() {
@Override
public void run() {
if (lastNetworkLocation !=null){
//send location to the server if valid
}
lastNetworkLocation = null;
}
}
}

private void initNetworkReadings() {
locationManager.removeUpdates(locationListenerNetwork);
try {
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
}

if (isGpsEnabled) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
}
}

LocationListener locationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
lastNetworkLocation = location;
// stop listening for Network locations
locationManager.removeUpdates(locationListenerNetwork);
}
...
}

每次读取 GPS 位置时,我都会将其添加到线程队列中:

scheduleTaskExecutor.submit(new Runnable() {
@Override
public void run() {
updateLocationOnServer(readLocation);
}
});

我遇到的问题是网络位置监听器永远不会调用 onLocationChanged(),当我像上面的代码一样在 Runnable 中使用它时。但是,如果我在服务启动时添加 initNetworkReadings(),我会立即触发 onLocationChanged()。所以我相信它与在 scheduleAtFixedRate 中使用有关。你认为这可能是什么问题?我对工作流程的看法有什么不好的地方吗?

最佳答案

如果您尝试使用 Handler 和 Runnable 而不是 scheduleAtFixedRate() 来设置重复会怎样?

Handler h = new Handler();
Runnable run = new Runnable(){
//Do your repeititive work here!
h.postDelayed(run, 60 * 1000);
};
h.post(run);

关于android - Android 中后台服务的位置跟踪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com