1

我是安卓编程新手,我正在尝试开发这个应用程序来调用安卓手机上的谷歌地图服务,然后访问一个网络服务来检索需要在地图上绘制的站点的纬度和经度值。

Foll 是代码,但是当我运行应用程序时,程序没有响应,它只绘制一个注释,而且平移和缩放事件也非常慢,有时代码会卡住。

请帮助解决问题。

OpenMap.java


public class OpenMap extends MapActivity 
{

private MapController mapController;
private MyLocationOverlay myLocation;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Get Mapping Controllers etc
    MapView mapView = (MapView) findViewById(R.id.map_view);
    mapController = mapView.getController();
    mapController.setZoom(1);
    mapView.setBuiltInZoomControls(true);

    // Add the MyLocationOverlay
    myLocation = new MyLocationOverlay(this, mapView);
    mapView.getOverlays().add(myLocation);

    myLocation.enableMyLocation();

    DemoOverlay demoOverlay = new DemoOverlay();
    mapView.getOverlays().add(demoOverlay);
    myLocation.runOnFirstFix(new Runnable() {
        public void run() {
            mapController.animateTo(myLocation.getMyLocation());
        }
    });
}

@Override
protected void onResume() {
    super.onResume();
    myLocation.enableMyLocation();
}

@Override 
protected void onPause() {
    super.onPause();
    myLocation.disableMyLocation();
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

}

DemoOverlay.java

public class DemoOverlay extends Overlay
{
ArrayList<String> arrlat_long = new ArrayList<String>();
public static String str;
public static String str1;
String responseBody;
int n=0;
 String Url =   "http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2";
 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5); 
 HttpClient httpclient = new DefaultHttpClient();   
   @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow)
   {
        super.draw(canvas, mapView, shadow);
        Projection projection = mapView.getProjection();
         if(!Url.endsWith("?"))
         {
                Url += "?";
         }

            int latSpan = mapView.getLatitudeSpan();
            int lngSpan = mapView.getLongitudeSpan();
            GeoPoint mapCenter = mapView.getMapCenter();
            int mapLeftGeo = mapCenter.getLongitudeE6() - (lngSpan / 2);
            int mapRightGeo = mapCenter.getLongitudeE6() + (lngSpan / 2);

            int mapTopGeo = mapCenter.getLatitudeE6() - (latSpan / 2);
            int mapBottomGeo = mapCenter.getLatitudeE6() + (latSpan / 2);

            GeoPoint geoPoint = this.getSampleLocation();


         nameValuePairs.add(new BasicNameValuePair("xmin", "-100"));
         nameValuePairs.add(new BasicNameValuePair("xmax", "-90"));
         nameValuePairs.add(new BasicNameValuePair("ymin", "40"));
         nameValuePairs.add(new BasicNameValuePair("ymax", "55"));
         nameValuePairs.add(new BasicNameValuePair("networkIDs", ""));
         nameValuePairs.add(new BasicNameValuePair("conceptKeyword", "precipitation"));
         nameValuePairs.add(new BasicNameValuePair("beginDate", "1/1/2009"));
         nameValuePairs.add(new BasicNameValuePair("endDate", "1/1/2010"));
         String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");
         Url += paramString;

  if ((geoPoint.getLatitudeE6() > mapTopGeo && geoPoint.getLatitudeE6() < mapBottomGeo)
                 && (geoPoint.getLongitudeE6() > mapLeftGeo && geoPoint.getLongitudeE6() < mapRightGeo)) 
              {
                    geoPoint = arrlat_long(n);
                    Point myPoint = new Point();
                    projection.toPixels(geoPoint, myPoint);

                    Bitmap marker = BitmapFactory.decodeResource(mapView.getContext().getResources(), R.drawable.markerblue);

                    canvas.drawBitmap(marker, myPoint.x - 15, myPoint.y - 30, null);
                }

   }

private GeoPoint getSampleLocation() 
    {
       GeoPoint sampleGeoPoint;
      // int n=0;

       try {
              HttpPost httppost = new HttpPost(Url); 
              httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
              HttpResponse response = httpclient.execute(httppost);
              responseBody = EntityUtils.toString(response.getEntity());

            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setValidating(false);
            XmlPullParser myxml = factory.newPullParser();
            InputStream raw = new ByteArrayInputStream(responseBody.getBytes());
            myxml.setInput(raw, null);

            int eventType = myxml.getEventType();
            while(eventType != XmlPullParser.END_DOCUMENT) 
            {
                if(eventType == XmlPullParser.START_DOCUMENT) 
                {

                    Log.d("ParseXmlActivity", "In start document");
                }
                else if(eventType == XmlPullParser.START_TAG) 
                {
                    if (myxml.getName().equals("latitude"))
                    {
                        str="";
                        str  += "Lat:" + myxml.nextText().toString();
                         Log.d("ParseXmlActivity", "In start tag = "+str);
                         arrlat_long.add(str);
                    }
                    if (myxml.getName().equals("longitude"))
                    {
                        str1 += "--Lon:" + myxml.nextText().toString();
                         Log.d("ParseXmlActivity", "In start tag = "+str1);
                         arrlat_long.add(str1);
                    }
                } 
                eventType = myxml.next();

            }
        } 
        catch (XmlPullParserException e) 
        {
        } 
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


   int in =Integer.parseInt(str);
       int in1 =Integer.parseInt(str1);   
       sampleGeoPoint = new GeoPoint(in,in1);
        return sampleGeoPoint;
    }}
4

1 回答 1

0

我认为您的方法是错误的方法。我不能重写你的整个代码,但会给你一些提示,如何去做。顺便说一句,它与 google apis 完全无关,它是你,onDraw在前台线程(又名 UI 线程)的方法中与 web 服务交谈!

所以要摆脱它,我建议如下:绝对避免在内部进行繁重的计算onDraw(Canvas)。使用AsyncTask来收集您的数据。在您提出请求后,您可以通过调用更新您的 MapViewpostInvalidate()并将其用于绘制。

也许overlaymanager lib的LazyLoad-feature对你来说很有趣

于 2012-06-18T23:19:43.650 回答