Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Blackberry 位置错误:无法从事件线程调用getLocation()方法_Blackberry_Error Handling_Gps_Location - Fatal编程技术网

Blackberry 位置错误:无法从事件线程调用getLocation()方法

Blackberry 位置错误:无法从事件线程调用getLocation()方法,blackberry,error-handling,gps,location,Blackberry,Error Handling,Gps,Location,我想做的是打开一个地图,点击一个有两个标准的按钮字段,用户必须指定位置,然后图像必须添加到位置,否则图像必须添加到用户当前位置 我遇到的问题是将这两个标准添加到线程/新线程甚至FieldChangeListener中的if语句中 我经常遇到的错误是: 位置错误:javax.microedition.location.LocationException: getLocation()方法不能是事件线程[0.0]中的cal[0.0]led 位置错误:无法从事件调用getLocation()方法 线 我

我想做的是打开一个地图,点击一个有两个标准的按钮字段,用户必须指定位置,然后图像必须添加到位置,否则图像必须添加到用户当前位置

我遇到的问题是将这两个标准添加到线程/新线程甚至FieldChangeListener中的if语句中

我经常遇到的错误是:

位置错误:javax.microedition.location.LocationException: getLocation()方法不能是事件线程[0.0]中的cal[0.0]led

位置错误:无法从事件调用getLocation()方法 线

我的代码:

FieldChangeListener=new FieldChangeListener(){
公共无效字段已更改(字段,int上下文){
ButtonField buttonClicked=(ButtonField)字段;
如果((buttonClicked.getLabel()).equals(“推”)){
CustomMapField-mMapField;
协调;
BlackBerryCriteria BlackBerryCriteria=null;
BlackBerryLocation BlackBerryLocation=null;
BlackBerryLocationProvider BlackBerryLocationProvider=null;
双双板条=0.0;
双倍LNG=0.0;
blackBerryCriteria=新的blackBerryCriteria();
中频(GPSInfo.isGPSModeAvailable(GPSInfo.GPS\u MODE\u CELLSITE)){
blackBerryCriteria.setMode(GPSInfo.GPS\u MODE\u CELLSITE);
}else if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS\u MODE\u ASSIST)){
blackBerryCriteria.setMode(GPSInfo.GPS\u MODE\u ASSIST);
}else if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS\u MODE\u autonomy)){
blackBerryCriteria.setMode(GPSInfo.GPS_MODE_autonomy);
}否则{
blackBerryCriteria.setCostAllowed(true);
blackBerryCriteria.setPreferredPowerConsumption(标准:功耗低);
}试一试{
blackBerryLocationProvider=(blackBerryLocationProvider)blackBerryLocationProvider.getInstance(blackBerryCriteria);
blackBerryLocation=(blackBerryLocation)blackBerryLocationProvider.getLocation(60);
QualifiedCoordinates QualifiedCoordinates=blackBerryLocation.getQualifiedCoordinates();
Doublelat=qualifiedCoordinates.getLatitude();
Doublelng=qualifiedCoordinates.getLongitude();
mCoordinates=新坐标(Doublelat,Doublelng,0);
mMapField=新的CustomMapField();
mMapField.mIcon=Bitmap.getBitmapResource(“coin_silver.png”);
mMapField.moveTo(mCoordinates);
mMapField.setZoom(1);
添加(mMapField);
}捕获(例外e){
System.out.println(“调试5”);
System.out.println(“位置错误:+e.toString());
System.out.println(“位置错误:+e.getMessage());
}
}
}
};
公共类CustomMapField扩展了MapField{
位图麦克风;
XYRect-mDest;
公共无效移动到(坐标){
超级移动到(坐标);
mDest=null;
}
受保护的空心漆(图形){
超级油漆(图形);
if(null!=mIcon){
if(null==mDest){
XYPoint fieldOut=新的XYPoint();
convertWorldToField(getCoordinates(),fieldOut);
int imgW=mIcon.getWidth();
int imgH=mIcon.getHeight();
mDest=新的XYRect(fieldOut.x-imgW/2,
y-imgH,imgW,imgH);
}
绘图位图(mDest,mIcon,0,0);
}
}
}
错误出现在以下行
add(mMapField)

Doublelat=qualifiedCoordinates.getLatitude();
Doublelng=qualifiedCoordinates.getLongitude();
mCoordinates=新坐标(Doublelat,Doublelng,0);
mMapField=新的CustomMapField();
mMapField.mIcon=Bitmap.getBitmapResource(“coin_silver.png”);
mMapField.moveTo(mCoordinates);
mMapField.setZoom(1);
添加(mMapField);
/*MapView MapView=新建MapView();
地图视图。设置纬度(最终纬度);
地图视图。设置经度(finalintlng);
mapView.setZoom(10);
MapsArguments mapsArgs=新的MapsArguments(mapView);
Invoke.invokeApplication(Invoke.APP_TYPE_map,mapsArgs);

请更详细地告诉我如何做,并请举例说明;我不明白为什么“mMapField”是一个自定义映射字段,“mappview”是一个类映射视图(请参见上面的代码片段)。

您应该使用
Invoke.invokeApplication(Invoke.APP_TYPE_MAPS,new MapsArguments(mMapField))代替
添加(mMapField)

获取位置是一项耗时的任务,即使在卫星能见度良好的情况下,也可能需要1分钟的时间,尽管较新的浆果在首次修复时间(TTFF)方面有了很大改进

耗时的任务,如打开连接或获取修复,不应该在事件线程中执行,因为该线程必须响应用户事件,如果您占用它,GUI就会冻结。而
fieldChanged
中运行的所有内容都在事件线程中运行。因此,RIM在其新的BlackBerryLocationProvider中实现了线程检测并抛出异常是件好事,现在您已经意识到这一糟糕的设计,可以采取纠正措施了

您有几个选项可以异步获得修复:

  • 使用
  • 产生一个新线程
  • 在需要修复之前很久(或每隔一定时间)先获取修复,然后在按下按钮时,它将很快可用(可以从以前保存的位置检索修复,也可以调用
    LocationProvider.getLastKnownLocation

  • 请告诉我,获取位置时,您的应用程序是否没有响应?@Anzy_