我有一个 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
}
}
}
最佳答案
在事件线程上调用位置监听器(您不为其提供代码)。如果在事件线程上调用的方法阻塞时间过长,则会导致您遇到挂起。操作系统最终将终止此类未能响应的应用程序。您需要查找可能需要很长时间才能执行的 LocationListenerImpl 片段,或者发布该代码以便我们查看。
关于java - 使用 LocationListener 的 BlackBerry 应用程序在 OS 6 上卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512430/