2015-01-17 3 views
0

У меня была какая-то проблема при попытке сделать анимацию типа setTimeout() в Android Java. У меня есть список геометрий, и я хотел, чтобы построить их на карте по одному:Задержка отправки обработчика Java Java на каждую запись в цикле

public void getDirection(Event eventModel, final Context context) { 
    String eventX = eventModel.getEventX(); 
    String eventY = eventModel.getEventY(); 

    //Code to get data geometry data from API and store in pathGeometries  
    final Drawable d = EventDrawableImage.resizeCurrentLocImage("current_loc", 
      context); 
    for (int iii = 0; iii < pathGeometries.size(); iii++) { 
     final int counter = iii ; 
      EventDetail.handler.postDelayed(new Runnable() 
      { 
       private long time = 0; 
       public void run() 
       { 
        time += 1000; 
        EventDetail.handler.postDelayed(this, 1000); 

        moveNext(pathGeometries.get(counter).getX(), 
          pathGeometries.get(counter).getY(), 0, d); 
       } 
      }, 1000); 
    } 
} 

public static void moveNext(double coordx, double coordy, int k, Drawable d){ 
    //EventMain.mMapView.removeAll(); 

    // Set center 
    Point p = new Point(coordx, coordy); 
    EventMain.mMapView.zoomToResolution(p, 1); 

    // Add marker 
    PictureMarkerSymbol graphicIcon; 
    graphicIcon = new PictureMarkerSymbol(d); 
    Symbol symbol = graphicIcon; 
    HashMap<String, Object> attrMap = new HashMap<String, Object>(); 
    attrMap.put("currentLoc", "User Current location"); 

    EventMain.graphicsLayer.addGraphic(new Graphic(p, symbol, attrMap));  
} 

Проблема, что у меня был теперь в каждой точке из pathGeometries переходящих в MoveNext(), он не имеет места За 20 секунд до перехода в другую точку. Вместо этого он просто зацикливается до конца, не останавливаясь в каждой точке.

Любые идеи? Заранее спасибо.

+0

Почему вы используете для 'loop'? для достижения требуемого поведения используйте только «Handler» –

ответ

2

Не уверен, если я правильно понял намерение, но попробовать что-то вроде этого:

long time = 0; 
for (int iii = 0; iii < pathGeometries.size(); iii++) { 
    final int counter = iii; 
    time += 1000; 
    EventDetail.handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      moveNext(pathGeometries.get(counter).getX(), 
        pathGeometries.get(counter).getY(), 0, d); 
     } 
    }, time); 
} 
+0

Он работает! Но как установить временную переменную как глобальную переменную и приращение, она решает проблему? Не возражаете ли вы немного разобраться? –

+0

@IWasSoLost с каждым циклом for, вы создаете новый «Runnable» с переменной «time». Это означает, что каждый Runnable будет иметь переменное время со значением 0. Однако вам нужно сохранить значение времени и увеличить его с каждой итерацией цикла. – Simas

+0

Я вижу. Большое спасибо! –

1

Пожалуй проходное и использовать индекс зацикливание построить время задержки.

for (int iii = 0; iii < pathGeometries.size(); iii++) { 
      EventDetail.handler.postDelayed(new Runnable() 
      { 
       public void run() 
       { 
        moveNext(pathGeometries.get(counter).getX(), 
          pathGeometries.get(counter).getY(), 0, d); 
       } 
      }, 1000 *(iii+1)); 
    } 
+0

Большое спасибо. Ваше решение работает тоже! –

+0

Отлично! Проблема с вашим кодом была в планировании. Каждая последующая ничья должна была быть отложена больше, чтобы она выполнялась по порядку. Все они стреляли через промежуток секунды, так сказать. – ZakiMak

+0

Вижу, я вижу. Большое спасибо! –