目前我现在有一个地图元素的数据库(调用database1
)(标记点,折线点和多边形点及其信息),对于折线/多边形点,我保留他们的点(Lat / Lng) )在一个单独的数据库中(调用此database2
),其中每个点都是以元素id database1
引用的单独数据库项。
当MapFragment加载时,我从AsyncTask
c = getActivity().getContentResolver().query(MapElements.CONTENT_URI,new String[] { MapElements.ID,MapElements.LOCATION_STRING,MapElements.LAYER_ID,MapElements.NEW_OR_MOD}, null, null, null);
循环光标,如果元素是折线或多边形,我用该元素的id
拉出所有点,然后创建一个List,以便稍后创建直线或多边形
Cursor c2 = context.getContentResolver().query(MapPoints.CONTENT_URI,new String[] { MapPoints.LAYER_ID, MapPoints.LATITUDE,MapPoints.LONGITUDE },
MapPoints.ELEMENT_ID + "=?",new String[] { String.valueOf(id) }, null);
if (c2 != null && c2.moveToFirst()) {
do {
locationArray.add(new LatLng(c2.getFloat(1), c2.getFloat(2)));
} while (c2.moveToNext());
}
c2.close();
然后我用列表
将其绘制到地图上Polyline line = map.addPolyline(new PolylineOptions().addAll(mElement.getLocationArray()));
整个过程可能需要很长时间,例如使用250
不同的元素需要大约10-15秒来加载所有元素,而地图元素的数量可能会更多或更少,所以显然点数越多它需要的时间越长。
看看谷歌地图应用程序看起来它们的所有标记都快速加载,有什么方法可以加快速度吗?
更新
我从traceview中了解了我能理解的内容,并且说Handler
次操作是第二次和第三次最长的操作。所以我所做的是取出我的asynctask中的处理程序,我用它来回调主线程放到地图上,并在2秒内完成该过程......
我现在拿出处理程序代码并将其放在自己的方法中,这就是方法
private void test(final MapElement mElement){
if (mElement.getType() > 0) {
try{
Handler h = new Handler(getActivity().getMainLooper());
if (mElement.getType() == 3) {
h.post(new Runnable(){
public void run() {
Polygon poly = map.addPolygon(new PolygonOptions()
.addAll(mElement.getLocationArray()));
String color = mElement.getFillColor();
String borderColor = mElement.getBorderCOlor();
poly.setFillColor(Color.parseColor("#"+color));
poly.setStrokeColor(Color.parseColor("#"+borderColor));
poly.setStrokeWidth(4);
poly.setVisible(false);
Marker m = map.addMarker(new MarkerOptions()
.position(mElement.getPoint())
.icon(BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));
m.setVisible(false);
m.setSnippet(String.valueOf(mElement.getID()));
mElement.setMarker(m);
mElement.setPolygon(poly);
}
});
mapElements.put(mElement.getID(), mElement);
} else if (mElement.getType() == 2) {
h.post(new Runnable(){
public void run() {
Polyline line = map
.addPolyline(new PolylineOptions()
.addAll(mElement.getLocationArray()));
String borderColor = mElement.getBorderCOlor();
if(borderColor == null){
line.setColor(Color.BLUE);
}else{
line.setColor(Color.parseColor("#"+borderColor));
}
line.setWidth(mElement.getThickness());
line.setVisible(false);
if(mElement.getLayerId() != 16){
Marker m = map.addMarker(new MarkerOptions()
.position(mElement.getPoint())
.icon(BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));
m.setVisible(false);
m.setSnippet(String.valueOf(mElement.getID()));
mElement.setMarker(m);
}
mElement.setPolyLine(line);
}
});
mapElements.put(mElement.getID(), mElement);
} else {
h.post(new Runnable(){
public void run() {
Marker m = map.addMarker(new MarkerOptions()
.position(mElement.getPoint()).icon(
BitmapDescriptorFactory.fromResource(mElement.getMarkerIcon())));
m.setVisible(false);
m.setSnippet(String.valueOf(mElement.getID()));
mElement.setMarker(m);
}
});
mapElements.put(mElement.getID(), mElement);
}
ContentValues values = new ContentValues();
values.put(MapElements.PLOTTED, 1);
getActivity().getContentResolver().update(Uri.withAppendedPath(MapElements.CONTENT_ID_URI_BASE,String.valueOf(mElement.getID())), values, null, null);
}catch(NullPointerException e){
e.printStackTrace();
}
}
}
即使取出处理程序并将test
方法放入onPostExecute仍会导致延迟。完成此方法需要0.058 seconds
一次,因此乘以250会导致15 seconds
所以这似乎是问题所在,我应该以不同的方式处理对主线程的回调吗?
答案 0 :(得分:0)
循环光标,如果元素是折线或多边形,我用该元素的id拉出所有点
这很可能是你的罪魁祸首。每个Hibernate用户都可以告诉你N + 1个查询非常非常糟糕。删除循环,在一个查询中加载所有点并在代码中生成逻辑。