等到方法完成内部循环android

时间:2015-12-01 06:41:09

标签: java android multithreading

我确实有以下for循环

数组部分有一个位置列表“LatLng” 对于循环中的每个部分,我正在调用animateMarker,它会在地图中为标记设置动画,如2秒

我的问题是这个循环过快,我甚至看不到每个部分的动画。它只是显示数组的最后一部分,有时也会冻结应用程序

animatemarker里面有一个带有延迟的hundler

我想在循环中看到每个部分的每个animateMarker 我对线程很不错,所以我确实需要帮助

问题在这里

        ArrayList<LatLng> sections = gd.getSection(mDoc);
            for (int j = 0; j < sections.size(); j++) {
                animateMarker(busMarker, new LatLng(sections.get(j).latitude, sections.get(j).longitude), false);
            }

我的animateMarker(没有问题可以解决!)

 public void animateMarker(final Marker marker, final LatLng toPosition,
                              final boolean hideMarker) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Projection proj = mMap.getProjection();
        Point startPoint = proj.toScreenLocation(marker.getPosition());
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 2000;

        final Interpolator interpolator = new LinearInterpolator();

        handler.post(new Runnable() {
            @Override
            public void run() {
                long elapsed = SystemClock.uptimeMillis() - start;
                float t = interpolator.getInterpolation((float) elapsed
                        / duration);
                double lng = t * toPosition.longitude + (1 - t)
                        * startLatLng.longitude;
                double lat = t * toPosition.latitude + (1 - t)
                        * startLatLng.latitude;
                marker.setPosition(new LatLng(lat, lng));

                if (t < 1.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                } else {
                    if (hideMarker) {
                        marker.setVisible(false);
                    } else {
                        marker.setVisible(true);
                    }
                }
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

我不知道是否有正确的方法,但这是我应该做的方式,

您可以打开一个新线程并在该线程中调用您的forloop。 你还需要使用maps api来制作动画2秒,让runnable对象为单个实例。所以它会更加友好。

for (int j = 0; j < sections.size(); j++) {
    synchronized (this) {
      runOnUiThread(new Runnable() 
      {
         public void run() 
         {
           animateMarker(busMarker, new LatLng(sections.get(j).latitude, sections.get(j).longitude), false);
         }
       });              
    }
    sleep(2000);  
}