2012-06-18 2 views
1

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

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

ответ

0

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

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

Может LazyLoad-особенность overlaymanager lib интересен для вас

+0

спасибо большое .. наверняка сделать это !! –

+0

Не могли бы вы рассказать мне, как использовать AsyncTask в моем коде ..? –

+0

Извините, я не могу, так как я не совсем понимаю, чего вы пытаетесь достичь. Возможно, вам даже не нужна AsyncTask. Если ваша Служба загружает многие значки в зависимости от диапазона местоположения, я буду загружать их один раз в зависимости от местоположения телефона (в определенном радиусе) и добавлять их все вместе. Вы должны быть более ясными, что вы пытаетесь сделать. –

Смежные вопросы