我目前正在学习制作一款使用Google Map向用户显示数据的Android应用。目前我正在使用Polyline绘制所有"数据/行"我想在地图上显示,但我直接在Google地图上绘制,如mMap.addPolyline(...)。 (我希望我可以发布截图,但我没有至少10个声望:-()。
但是我在地图上绘制所有这些线条时遇到了一些性能问题,因为它们在那里的一个小区域(通过放大)包含500~900线。问题是,当应用程序正在绘制所有这些数据时,应用程序挂起/停止一秒钟,如冻结,然后一旦完成绘制,应用程序将继续工作。
所以我的问题是,如何在地图上绘制时,如何在没有应用程序挂起/停止的情况下顺利绘制那么多折线?例如,当地图上绘制折线时,用户可以在地图上移动吗?
我曾尝试在不同的线程中在地图上绘制Polylines,但是我得到了一个错误,例如必须在主线程上绘制(无法记住确切的异常错误)。除此之外,我还在互联网上搜索这样的例子,但我只找到了Overlay或ItemizedOverlay的例子,但据我所知,这些都被弃用了。这样做还有其他选择吗?你能告诉我一些例子或指导我找到合适的资源吗?向我展示一些代码会非常有用。
谢谢
更新 忘了在这里包含我的代码,这里是我绘制折线的代码:
private class LoadDataTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// Show a message saying this app is fetching data
Toast.makeText(mMainActivity,
"Fetching data ...",
Toast.LENGTH_SHORT)
.show();
}
@Override
protected Void doInBackground(String... urls) {
// Load then read the data from a url in the background
loadData();
readData();
return null;
}
@Override
protected void onPostExecute(Void unused) {
// draw lines here
PolylineOptions lineOptions = new PolylineOptions()
.add(new LatLng(locations[0].getLatitude(), locations[0].getLongitude()))
.add(new LatLng(locations[1].getLatitude(), locations[1].getLongitude()))
.color(Color.GREEN)
.width(5f);
Polyline polyline = mMap.addPolyline(lineOptions);
lineList.add(polyline);
}
}
答案 0 :(得分:0)
您应该使用asynclass并显示progressdialog
private class ShowPolyLine extends
AsyncTask<Void, Void, Void> {
ProgressDialog pdDialog;
@Override
protected void onPreExecute() {
try {
pdDialog = new ProgressDialog(YourActivity.this);
pdDialog.show();
pdDialog.setCancelable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected TicketTemplate doInBackground(Void... params) {
try {
// show pollyline code
} catch (Exception e) {
Log.d("exception", ".........................." + e);
return null;
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pdDialog.dismiss();
}
}
并将其称为ShowPolyLine().execute();
答案 1 :(得分:0)
运行获取数据以在背景线程上绘制并仅在主踏板上绘制线条,使用下面的代码我们绘制3000行
Set<String> routeNames=cordinatePojos.keySet();
arrayList=new ArrayList<String>();
arrayList.addAll(routeNames);
iterator=routeNames.iterator();
color[0]=Color.BLUE;
color[1]=Color.GREEN;
color[2]=Color.RED;
color[3]=Color.CYAN;
conuter=0;
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (iterator.hasNext()) {
latLngs = cordinatePojos.get(iterator.next());
sortLocations(latLngs, latLngs.get(0).latitude, latLngs.get(0).longitude);
Log.d("test on background======",""+latLngs.get(0)+"======"+conuter);
final PolylineOptions polyLineOptions = new PolylineOptions();
polyLineOptions.addAll(latLngs);
polyLineOptions.width(15-i-i);
polyLineOptions.color(color[i]);
float[] result1 = new float[3];
android.location.Location.distanceBetween(latLngs.get(0).latitude,latLngs.get(0).longitude, latLngs.get(latLngs.size()-1).latitude, latLngs.get(latLngs.size()-1).longitude, result1);
Float distance1 = result1[0];
totalDistance=totalDistance+distance1;
// final MarkerOptions markerOptions=new MarkerOptions().position(latLngs.get(0)).title(arrayList.get(conuter)+"==distance between this road is "+ distance1/1000 + " Km");
// final MarkerOptions lastMarkerOptions=new MarkerOptions().position(latLngs.get(latLngs.size()-1)).title(arrayList.get(conuter)+"==distance between this road is "+distance1/1000+ " Km");
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
/*googleMap.addMarker(markerOptions);
googleMap.addMarker(lastMarkerOptions);*/
googleMap.addPolyline(polyLineOptions);
if (i>2) {
i=0;
}
i++;
}
});
if (conuter>3000) {
break;
}
conuter++;
}
答案 2 :(得分:0)
试试这个::
GoogleMap mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
List<Polyline> mPolylines = new ArrayList<Polyline>();
// Add polylines to the map and the list
mPolylines.add(mMap.addPolyline(polyOpts));
...
mPolylines.add(mMap.addPolyline(polyOpts));
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng clickCoords) {
for (PolylineOptions polyline : mPolylines) {
for (LatLng polyCoords : polyline.getPoints()) {
float[] results = new float[1];
Location.distanceBetween(clickCoords.latitude, clickCoords.longitude,
polyCoords.latitude, polyCoords.longitude, results);
if (results[0] < 100) {
polyline.setVisible(false);
Log.e(TAG, "Found @ "+clickCoords.latitude+" "+clickCoords.longitude);
return;
}
}
}
}
});