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