让Android MainActivity等待线程完成

时间:2014-10-20 20:48:00

标签: android multithreading google-maps-markers handler google-maps-android-api-2

我正在探索谷歌地图Android Api v2 ,我发现了一些我正在搞乱的麻烦!

我正在使用包含来自XML文件的路由的LatLng数组。

我希望应用使用导入的数据模拟车辆乘坐。 (显示一个简单的标记,显示循环中数组中包含的'当前'位置)

我找到了一种方法,将标记从一个点激活到另一个点。当我使用两个坐标时它工作得很好,但是当我使用整个数组时它会变得很疯狂!

我想这是因为animateMarker方法中的处理程序

所以,我的问题是,如何使主线程等待animateMarker完成,以便正确查看模拟路线。

谢谢。

以下是代码:

public class MainActivity extends Activity {

GoogleMap mMap;
ArrayList<LatLng> coordinates;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /**
     * Here I import the LatLng array from an XML file
     */


    mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

    Marker myMarker;

    myMarker = mMap.addMarker(new MarkerOptions()
    .position(coordinates.get(0)));

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates.get(0),17));

    for(int i=0;i<coordinates.size()-1;i++){
         animateMarker(myMarker, coordinates.get(i+1), false);
         mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinates.get(i),17));
    }


 }

/**
 * 
 * @param marker
 * @param toPosition
 * @param hideMarker
 * @return 
 */
public  void animateMarker(final Marker marker, final LatLng toPosition,
        final boolean hideMarker) {

    final Handler handler = new Handler();
    final long start = SystemClock.uptimeMillis();
    final LatLng startLatLng= marker.getPosition();
    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)

使用AsyncTask

这是一个例子

     private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
         protected Long doInBackground(URL... urls) {
             int count = urls.length;
             long totalSize = 0;
             for (int i = 0; i < count; i++) {
                 totalSize += Downloader.downloadFile(urls[i]);
                 publishProgress((int) ((i / (float) count) * 100));
                 // Escape early if cancel() is called
                 if (isCancelled()) break;
             }
             return totalSize;
         }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }

创建后,任务执行非常简单:

new DownloadFilesTask().execute(url1, url2, url3);