2012-04-02 32 views
1

私はforループを持っています。その中にpoiのマップを表示するメソッドがあります。今私がしようとしているのは、各poiをシーケンスで表示することです。つまり、forループは一気に完了し、最後に最終出力が表示されます。ループ実行のために内部で遅延を与える

しかし、私はそれが順番になることを願っています。繰り返しするたびに、これらのジオポイントがどこかで動いているアニメーションを見ることができるはずです。ここで

は、私はのThread.sleep(長いミリ秒)を使用してみました

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

、私のコードです。しかし、それは解決策ではない、誰が私に何をすべきか教えてもらえますか?

+0

Thread.sleep()の何が問題なのですか? –

+0

Thread.sleep()は、私のUIを台無しにし、ジオポイントがハイライト表示されると一度だけ表示されます。 – tejas

答えて

0

最後に私は答えを思いついた。 @ニコと@ヘリー、これはあなたのコードに似ているかどうかわかりません。 testge0()ここで

は私の変化であり、

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

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

ですが、あなたの助けをありがとうございました。これは私のために働いています

2

あなたの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 /*); 


    } 
+0

ありがとう、私はこのコードを試してみます。セミコロン(;)はここにはありませんか? – tejas

+0

ああ私のコメントのために)後に追加する必要があります; – Herry

+0

これは私の以前のコードと同じように動作します。遅延を1000に増やしましたが、それでもまだ伸びています – tejas

1
あなたはその実行可能のためのコールバックを削除します)Runnable実行(内、実際の操作を行いハンドラpostDelayedとの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

私はforループブロックfor run()? – tejas

+0

runメソッドでmoveToPOI()を呼び出す必要があります。最初にアイテムを作成し、ループの外側で実行可能ファイルを開始します。また、moveToPOI(index)に渡すために、実行可能なメンバ整数が必要です。 – Niko

+0

public void animateTo(GeoPointポイント、実行可能なjava.lang.Runnable)。これを使うことをお勧めします。ここで渡す実行ファイルは、アニメーションが完了したときに呼び出されるため、そこで新しいアニメーションを開始することができます。ここではpostDelayedコールは必要ありません。 – Niko

関連する問題