Задержка внутри для выполнения цикла - PullRequest
1 голос
/ 02 апреля 2012

У меня есть цикл for, внутри которого я вызываю метод для отображения POI на карте.Теперь я пытаюсь показать каждую точку в последовательности.Я имею в виду, что цикл for завершается с большой натяжкой и, наконец, представлен с окончательным выводом.

Но я хочу, чтобы он был в порядке, это означает, что каждый раз, когда цикл повторяется, я должен видеть анимациюгде эти гео-точки перемещаются с места на место.

Вот мой код,

 for (i=currentPOIindex;i<arraypoi.size();i++) {
            poi = arraypoi.get(i);
            latitude = poi.getLatitude().toString();
            longitude = poi.getLongitude().toString();
            placename = poi.getPlaceName().toString();
            mapdescription = poi.getPoiDecsription().toString();
            lat = Double.parseDouble(latitude);
            lng = Double.parseDouble(longitude);
            //use the poiIndex to identify which poi is highlighted
            itemizedOverlay.poiIndex = i;
            geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
            OverlayItem overlayitem = new OverlayItem(geopoint,fitTextToMapCallout(placename), fitTextToMapCalloutDescription("hello"));
            itemizedOverlay.addOverlay(overlayitem);
            mapOverlays.add(itemizedOverlay);
           //this method is meant to move to each geopint one by one. 
           //And I am trying to give a delay before this method is called
            moveToPOI(i);
        }


  public void moveToPOI(int currentPOI) {
    try {
        AudioMapOverLay overlay = (AudioMapOverLay) mapOverlays.get(currentPOI);
        poi = arraypoi.get(currentPOI);
        latitude = poi.getLatitude().toString();
        longitude = poi.getLongitude().toString();
        placename = poi.getPlaceName().toString();
        lat = Double.parseDouble(latitude);
        lng = Double.parseDouble(longitude);
        geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
        overlay.onForwardOrRewind(currentPOI, overlay);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Я пытался использовать Thread.sleep (длинная мс);Но это не решение, кто-нибудь может сказать мне, что делать?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Вы должны сделать что-то подобное в своем цикле For:

  final Handler handler = new Handler();
   for (i=currentPOIindex;i<arraypoi.size();i++) {
          poi = arraypoi.get(i);
          latitude = poi.getLatitude().toString();
          longitude = poi.getLongitude().toString();
          placename = poi.getPlaceName().toString();
          mapdescription = poi.getPoiDecsription().toString();
           lat = Double.parseDouble(latitude);
           lng = Double.parseDouble(longitude);
        //use the poiIndex to identify which poi is highlighted
           itemizedOverlay.poiIndex = i;
           geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
            OverlayItem overlayitem = new  OverlayItem(geopoint,fitTextToMapCallout(placename), fitTextToMapCalloutDescription("hello"));
        itemizedOverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedOverlay);
       //this method is meant to move to each geopint one by one. 
       //And I am trying to give a delay before this method is called
        handler.postDelayed(new Runnable() {
        @Override
      public void run() {
     //Do something after 100ms
       moveToPOI(i);

   }
  }, 100/*This is Delay Value in Milli Second set which suit for your /*);  


    }
1 голос
/ 02 апреля 2012

Вы можете использовать Handler postDelayed и Runnable, который выполняет фактическую операцию, внутри Runnable run () вы удаляете обратные вызовы для этого runnable и снова отправляете его в обработчик.Если вы получаете несколько обратных вызовов для завершенной операции, вы можете использовать это для повторного запуска запуска.

Handler handler = new Handler()
handler.postDelayed(myRunnable, MY_DELAY);
Runnable myRunnable = new Runnable() {
public void run() {
//do the stuff

// Check if another loop sequence is needed and start runnable again
handler.removeCallbacks(myRunnable);
handler.postDelayed(myRunnable, MY_DELAY); }
0 голосов
/ 02 апреля 2012

Наконец-то я пришел с ответом.@Niko и @Herry, я не знаю, похоже ли это на твой код.

вот мое изменение,

     notification = new Runnable() {
            public void run() {
                testgeo();
            }
        };
        handler.postDelayed(notification, 1500);

, где testge0 (),

 private void testgeo() {
    poi = arraypoi.get(index);
    latitude = poi.getLatitude().toString();
    longitude = poi.getLongitude().toString();
    placename = poi.getPlaceName().toString();
    // mapdescription = poi.getPoiDecsription().toString();
    lat = Double.parseDouble(latitude);
    lng = Double.parseDouble(longitude);
    if (index == currentPOIindex) {
        drawable = this.getResources().getDrawable(R.drawable.poiiconactive);
        itemizedOverlay = new AudioMapOverLay(drawable, objMapView,this);
    } else {
        drawable = this.getResources().getDrawable(R.drawable.mapicon);
        itemizedOverlay = new AudioMapOverLay(drawable, objMapView,this);
    }
    itemizedOverlay.poiIndex = index;
    geopoint = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
    OverlayItem overlayitem = new OverlayItem(geopoint,fitTextToMapCallout(placename),
            fitTextToMapCalloutDescription("hello"));
    itemizedOverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedOverlay);
    moveToPOI(index);
}

Но спасибо за вашу помощьЭто работает для меня

...