1

私がやりたいことは、2 つの基準を持つボタンフィールドをクリックしてマップを開くことです。ユーザーは場所を指定し、画像をその場所に追加する必要があります。それ以外の場合は、画像をユーザーの現在の場所に追加する必要があります。

私が抱えている問題は、両方の基準をスレッド/新しいスレッドまたは FieldChangeListener の if ステートメントに追加することです。

私が取得し続けるエラーは次のとおりです。

ロケーションのエラー:javax.microedition.location.LocationException: getLocation() メソッドは、イベント スレッド [0.0] からの cal[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 に答える