Android 程序响应非常慢[GoogleAPI]

Android 程序响应非常慢[GoogleAPI],android,eclipse,web-services,google-maps,Android,Eclipse,Web Services,Google Maps,我是android编程新手,我正在尝试开发这个应用程序,在android手机上调用谷歌地图服务,然后访问web服务来检索需要绘制在地图上的站点的纬度和经度值 Foll是代码,但当我运行应用程序时,程序没有响应,它只绘制一个注释,而且平移和缩放事件非常慢,有时代码会卡住 请帮助解决这个问题 OpenMap.java public class OpenMap extends MapActivity { private MapController mapController; private

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

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;
}
}


我认为你的方法是错误的。我不能重写整个代码,但会给你一些提示,如何做。顺便说一句,它与谷歌API毫无关系,是你,在前台线程即UI线程的onDraw方法中与Web服务对话

为此,我建议如下: 绝对避免在onDrawCanvas中进行繁重的计算。使用、来收集数据。在您的请求之后,您可以通过调用postInvalidate更新地图视图,并将其用于绘制


也许OverlyManager的懒散加载功能对您来说很有趣。。我一定会那样做的!!对不起,我不能,因为我不完全理解你想要达到的目标。也许你甚至不需要异步任务。如果您的服务根据位置范围下载多个图标,我会根据手机在某个基数中的位置下载图标一次,然后将它们全部添加到一起。你必须更清楚你想做什么。
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;
    }}