0

我在探索谷歌地图Android Api v2,我发现了一些麻烦,我正在搞乱!让Android MainActivity等待线程完成

我正在处理一个包含来自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); 
       } 

      } 
     } 

    }); 

} 

} 

回答

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); 
+0

我尝试过,但你的意思是?,包括for循环内的doInBackground方法?或者只是用一个thread.sleep填充它? – 2014-10-23 20:12:36