Программа отвечает очень медленно [Google Api]

1

Я новичок в программировании на Android, и я пытаюсь разработать это приложение для вызова сервисов Google Maps на телефоне Android, а затем для доступа к веб-сервису для получения значения широты и долготы станций, которые необходимо отобразить на карте.

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;
    }}
Теги:
google-maps
web-services

1 ответ

0
Лучший ответ

Я думаю, что ваш подход - неправильный способ сделать это. Я не могу переписать вам весь код, но дам вам несколько советов, как это сделать. Кстати, совершенно нечего делать, с google apis, его вы, который разговаривает с onDraw внутри метода onDraw Thread (aka UI-Thread)!

Поэтому, чтобы выйти из этого, я бы предложил следующее: Абсолютно избегайте делать тяжелые вычисления внутри onDraw(Canvas). Используйте AsyncTask для сбора данных. После вашего запроса вы можете обновить свой MapView, вызвав postInvalidate() и сделайте это для рисования.

Возможно, для вас интересна функция LazyLoad для overlaymanager lib

  • 0
    большое спасибо .. конечно сделаю это !!
  • 0
    не могли бы вы сказать мне, как использовать AsyncTask в моем коде ..?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню