我有一个Java应用程序,它使用 LocationProvider API在应用程序启动时注册 LocationListener ,并在关闭应用程序时注销它。当将应用程序放在后台并将其恢复到前台时,它也会这样做。
这在大多数情况下运行良好,但我最近在不同的设备上遇到了应用的冻结/挂起(例如,我可以在我的BlackBerry Torch OS 6上重现它,似乎更经常发生在OS 6设备上)。
打开该应用,关闭,重新开启,当我尝试冻结 >再次关闭。我不能再关闭它了。我必须使用“切换应用程序”功能转到另一个应用程序(通过按住菜单按钮或按绿色或红色按钮)。
在我收到错误消息后,说应用程序没有响应并关闭。
代码如下所示:
public void activate() {
if (ApplicationPermissionsManager.getInstance().getPermission(14) == ApplicationPermissions.VALUE_ALLOW) {
startLocationProvider();
}
}
public void deactivate() {
if (ApplicationPermissionsManager.getInstance().getPermission(14) == ApplicationPermissions.VALUE_ALLOW) {
stopLocationProvider();
}
}
public boolean onClose() {
stopLocationProvider();
System.exit(0);
return true;
}
public void startLocationProvider() {
try {
locationProvider = LocationProvider.getInstance(new BlackBerryCriteria(GPSInfo.GPS_MODE_ASSIST));
if (locationProvider != null) {
locationProvider.setLocationListener(new LocationListenerImpl(), 10, 9, -1);
}
} catch (Exception le) {
// log it
}
}
public void stopLocationProvider() {
if (locationProvider != null) {
try {
locationProvider.setLocationListener(null, -1, -1, -1);
locationProvider = null;
} catch (Exception se) {
// log it
}
}
}
答案 0 :(得分:1)
在事件线程上调用位置侦听器(您不提供代码)。如果在事件线程上调用的方法阻塞的时间太长,则会导致您遇到的挂起。操作系统最终会因无法响应而终止此类应用程序。您需要查找可能需要很长时间才能执行的LocationListenerImpl段,或者发布该代码以便我们查看它。