1

我想要做的是通过单击带有两个条件的按钮字段打开地图,用户必须指定位置,然后必须将图像添加到该位置,否则必须将图像添加到用户当前位置。

我遇到的问题是将两个条件都添加到线程/新线程甚至 FieldChangeListener 中的 if 语句中。

我不断收到的错误是:

位置错误:javax.microedition.location.LocationException:getLocation() 方法无法从事件线程 [0.0] 调用 [0.0]

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

我的代码:

FieldChangeListener Listener = new FieldChangeListener() {
    public void fieldChanged(Field field, int context) {
        ButtonField buttonClicked = (ButtonField) field;
        if ((buttonClicked.getLabel()).equals("Push")) {
            CustomMapField mMapField;
            Coordinates mCoordinates;
            BlackBerryCriteria blackBerryCriteria = null;
            BlackBerryLocation blackBerryLocation = null;
            BlackBerryLocationProvider blackBerryLocationProvider = null;
            double Doublelat = 0.0;
            double Doublelng = 0.0;
            blackBerryCriteria = new BlackBerryCriteria();
            if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS_MODE_CELLSITE)){
                    blackBerryCriteria.setMode(GPSInfo.GPS_MODE_CELLSITE);
            }else if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS_MODE_ASSIST)){
                blackBerryCriteria.setMode(GPSInfo.GPS_MODE_ASSIST);
            }else if(GPSInfo.isGPSModeAvailable(GPSInfo.GPS_MODE_AUTONOMOUS)){
                blackBerryCriteria.setMode(GPSInfo.GPS_MODE_AUTONOMOUS);
            }else{
                blackBerryCriteria.setCostAllowed(true);
                blackBerryCriteria.setPreferredPowerConsumption(Criteria.POWER_USAGE_LOW);
            } try {
                blackBerryLocationProvider = (BlackBerryLocationProvider) BlackBerryLocationProvider.getInstance(blackBerryCriteria);
                blackBerryLocation = (BlackBerryLocation) blackBerryLocationProvider.getLocation(60);
                QualifiedCoordinates qualifiedCoordinates = blackBerryLocation.getQualifiedCoordinates();
        
                Doublelat = qualifiedCoordinates.getLatitude();
                Doublelng = qualifiedCoordinates.getLongitude();
                mCoordinates = new  Coordinates(Doublelat, Doublelng, 0);
                mMapField = new CustomMapField();
                mMapField.mIcon = Bitmap.getBitmapResource("coin_silver.png");
                mMapField.moveTo(mCoordinates);
                mMapField.setZoom(1);
                add(mMapField);
             }catch(Exception e){
                System.out.println("Debug 5");
                System.out.println("Error in location :"+e.toString());
                System.out.println("Error in location :"+e.getMessage());
             }
        }
    }
};

public class CustomMapField extends MapField {
    Bitmap mIcon;
    XYRect mDest;

    public void moveTo(Coordinates coordinates) {
        super.moveTo(coordinates);
        mDest = null;
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (null != mIcon) {
            if (null == mDest) {
                XYPoint fieldOut = new XYPoint();
                convertWorldToField(getCoordinates(), fieldOut);
                int imgW = mIcon.getWidth();
                int imgH = mIcon.getHeight();
                mDest = new XYRect(fieldOut.x - imgW / 2, 
                fieldOut.y - imgH, imgW, imgH);
            }
            graphics.drawBitmap(mDest, mIcon, 0, 0);
        }
    }
}

错误在于以下行add(mMapField);

  Doublelat = qualifiedCoordinates.getLatitude();
  Doublelng = qualifiedCoordinates.getLongitude();
  mCoordinates = new  Coordinates(Doublelat, Doublelng, 0);
  mMapField = new CustomMapField();
  mMapField.mIcon=Bitmap.getBitmapResource("coin_silver.png");
  mMapField.moveTo(mCoordinates);
  mMapField.setZoom(1);
  add(mMapField);

  /*MapView mapView = new MapView();
    mapView.setLatitude(finalintlat);
    mapView.setLongitude(finalintlng);
    mapView.setZoom(10);
    MapsArguments mapsArgs = new MapsArguments(mapView);
    Invoke.invokeApplication(Invoke.APP_TYPE_MAPS, mapsArgs);

请更详细地告诉我如何做到这一点,并举个例子;我无法理解“mMapField”是如何自定义 MapField 而“mapView”是 Mapview 类(请参阅我上面的代码片段)。

4

2 回答 2

2

获取位置是一项耗时的任务,即使卫星能见度良好,也可能需要长达 1 分钟的时间,尽管较新的浆果已经大大改善了首次定位时间 (TTFF)。

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

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

  1. 使用LocationListener
  2. 产生一个新线程。
  3. 在您需要它之前(或定期)预先获得修复,然后在按下按钮时您将快速获得它(从您之前保存它的地方检索它或调用LocationProvider.getLastKnownLocation)。
于 2012-10-05T08:51:34.150 回答
0

你应该使用Invoke.invokeApplication(Invoke.APP_TYPE_MAPS, new MapsArguments(mMapField));代替add(mMapField);

于 2012-10-04T11:11:16.850 回答