我一开始就深表歉意,因为我知道回答这个问题就像把果冻钉在墙上一样。我会提供尽可能多的细节,但没有太多可以提供的。
我正在开发一个黑莓应用程序,它使用 GPS 每 xx 分钟获取用户的位置(可能是 15、30 或 60,具体取决于用户设置的偏好);它将位置数据发送到 Web 服务。
它运行良好并报告用户的位置正常,但只有大约 16-18 小时,然后应用程序停止报告并且用户界面不再工作。不会抛出任何错误,它只是在重新启动应用程序之前不再响应用户选择。
令我感到奇怪的是,应用程序崩溃是相当可预测的——它永远不会在 8 小时或 10 小时后崩溃,它总是在 16-18 小时的窗口内,这表明崩溃与 GPS/WebService 有关报告。
基本上,如果我从 GPS/WebService 的角度来看,它看起来好像应用程序可以设法向 WebService 报告 36 次(每半小时,持续 18 小时),然后它就死了。
我将在这里发布一些代码,希望它能激发某人的想法。
private void updateGPSLocation(){
gps_interval_timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try{
getGPSLocation();
if(longitude != 0.0 && latitude != 0.0)
{
updateSubscriberLocation();
}
}catch(Exception ex){
}
}
}, 0, gps_interval);
}
这是前面代码中引用的 getGPSLocation() 调用的代码:
public void getGPSLocation(){
try{
//GPS thread
BlackBerryLocationProvider provider = (BlackBerryLocationProvider)LocationProvider.getInstance(new BlackBerryCriteria(GPSInfo.GPS_MODE_ASSIST));
//geolocation thread
BlackBerryLocationProvider provider1 = (BlackBerryLocationProvider)LocationProvider.getInstance(new BlackBerryCriteria(LocationInfo.GEOLOCATION_MODE_CELL));
if (provider != null){
provider.setLocationListener(new LocationListenerImpl(), _interval, 1, 1);
}
if(provider1 != null){
provider1.setLocationListener(new LocationListenerImpl(), _interval, 1, 1);
}
}
catch(Exception le){
}
}
再次,我很抱歉,我知道这是一个开放式问题。Blackberry GPS 是否存在任何已知问题?因为我正在使用计时器任务来安排基于间隔的报告,所以我是否可能只是通过将计划的计时器任务放入队列中来吸收所有可用内存?我是否需要使用 cancel() 方法显式处理计时器任务?就像是:
gps_interval_timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try{
getGPSLocation();
if(longitude != 0.0 && latitude != 0.0)
{
updateSubscriberLocation();
}
}catch(Exception ex){
}
finally
{
this.cancel();
}
}
}, 0, gps_interval);
非常感谢任何帮助。谢谢!
更新了 LocationListener 代码
private class LocationListenerImpl implements LocationListener {
public void locationUpdated(LocationProvider provider, Location location) {
if(location.isValid()) {
longitude = location.getQualifiedCoordinates().getLongitude();
latitude = location.getQualifiedCoordinates().getLatitude();
}
}
public void providerStateChanged(LocationProvider provider, int newState) {
}
}
getGPSLocation() 中使用的 _interval 变量设置为 -1。