比如现在在做的百度地图撒点项目,5个图层从数据库获取到2000多个点需要铺在地图上,使用了rxjava+retrofit2进行网络请求,这个时候同时移动地图是不会造成地图卡顿的,但是在移动的实际过程中缺出现了卡顿,那么怀疑是往地图上添加图标的过程中出现了耗时操作,于是在对每个for循环进行耗时时间打印,结果果然发现在抽稀步骤时时间比较长,于是在这里改用多线程进行操作。
/**
* 从数据库获取图层中的点
*/
public void getLayerPointList(LayerConfig layerConfig, LatLng[] pts, double zoomLevel) {
long l = System.currentTimeMillis();
if (pts != null && pts.length > 0) {
latitude0 = pts[0].latitude; //左上角坐标
longitude0 = pts[0].longitude;
latitude1 = pts[1].latitude; //右下角坐标
longitude1 = pts[1].longitude;
}
String table = layerConfig.getTableName();
// subScribe = ApiManager.getInstance()
ApiManager.getInstance()
.pointApiService()
.getManagerSelect(table, latitude0, longitude0, latitude1, longitude1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(listResponseObj -> {
List<LinkedHashMap<String, Object>> pointList = listResponseObj.data; //该图层在屏幕内的点
long end1 = System.currentTimeMillis();
long l1 = end1 - l;
Log.e("LayerConfig", "异步请求数据时间:" + l1);
Log.e("LayerConfig", "通过查询sql语句查询点获取成功:" + pointList.size() + "");
//2、遍历服务端返回的对象map
if (pointList != null && pointList.size() > 0) {
//3、抽稀算法,去除重复的点。遍历所有图层的所有站点列表,生成绘制任务列表,任务ID=layerId +“_”+ PointId
allNewTaskIdList.clear();
long l2a = System.currentTimeMillis();
if (zoomLevel <= 13) { //2公里比例尺
// vacuateMap.clear();
// long l2b = System.currentTimeMillis();
// for (LinkedHashMap<String, Object> stringObjectMap : pointList) {
// double latitude = (double) stringObjectMap.get("LATITUDE");
// double longitude = (double) stringObjectMap.get("LONGITUDE");
// BigDecimal b_latitude = new BigDecimal(latitude).setScale(2, BigDecimal.ROUND_HALF_UP);
// BigDecimal b_longitude = new BigDecimal(longitude).setScale(2, BigDecimal
// .ROUND_HALF_UP);
//
// if (!vacuateMap.containsKey(b_latitude + "/" + b_longitude)) {
// vacuateMap.put(b_latitude + "/" + b_longitude, stringObjectMap);
// }
// }
new Thread(new Runnable() {
@Override
public void run() {
long l2d = System.currentTimeMillis();
for (int i = 0; i < pointList.size()/2; i++) {
LinkedHashMap<String, Object> stringObjectMap = pointList.get(i);
double latitude = (double) stringObjectMap.get("LATITUDE");
double longitude = (double) stringObjectMap.get("LONGITUDE");
BigDecimal b_latitude = new BigDecimal(latitude).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal b_longitude = new BigDecimal(longitude).setScale(2, BigDecimal
.ROUND_HALF_UP);
if (!vacuateMap.containsKey(b_latitude + "/" + b_longitude)) {
vacuateMap.put(b_latitude + "/" + b_longitude, stringObjectMap);
}
}
long l22d = System.currentTimeMillis();
long l2djian = l22d - l2d;
Log.e("LayerConfig", "新线程抽稀时间1:" + l2djian);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
long l2d = System.currentTimeMillis();
for (int i = pointList.size()/2; i < pointList.size(); i++) {
LinkedHashMap<String, Object> stringObjectMap = pointList.get(i);
double latitude = (double) stringObjectMap.get("LATITUDE");
double longitude = (double) stringObjectMap.get("LONGITUDE");
BigDecimal b_latitude = new BigDecimal(latitude).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal b_longitude = new BigDecimal(longitude).setScale(2, BigDecimal
.ROUND_HALF_UP);
if (!vacuateMap.containsKey(b_latitude + "/" + b_longitude)) {
vacuateMap.put(b_latitude + "/" + b_longitude, stringObjectMap);
}
}
long l22d = System.currentTimeMillis();
long l2djian = l22d - l2d;
Log.e("LayerConfig", "新线程抽稀时间2:" + l2djian);
}
}).start();
// long l22b = System.currentTimeMillis();
// long l2bjian = l22b - l2b;
// Log.e("LayerConfig", "抽稀时间:" + l2bjian);
long l2c = System.currentTimeMillis();
for (String singleVacuatePoint : vacuateMap.keySet()) {
Map<String, Object> stringObjectMap = vacuateMap.get(singleVacuatePoint);
Object pointId = stringObjectMap.get("P_ID");
allNewTaskIdList.add(table + "_" + pointId); //请求到的点
}
long l22c = System.currentTimeMillis();
long l2cjian = l22c - l2c;
Log.e("LayerConfig", "allNewTaskIdList:" + l2cjian);
} else {
for (Map<String, Object> stringObjectMap : pointList) {
Object pointId = stringObjectMap.get("P_ID");
allNewTaskIdList.add(table + "_" + pointId); //请求到的点
}
}
long l22a = System.currentTimeMillis();
long l2ajian = l22a - l2a;
// Log.e("LayerConfig", "抽稀后的点的数量:" + vacuateMap.size());
Log.e("LayerConfig", "allNewTaskIdList总时间:" + l2ajian);
//4、调用optimiz方法
long l3 = System.currentTimeMillis();
List<String> addTaskIdList = optimizeTask(allNewTaskIdList);
long l33 = System.currentTimeMillis();
long l3jian = l33 - l3;
Log.e("LayerConfig", "optimizeTask时间:" + l3jian);
long l2d = System.currentTimeMillis();
for (Map<String, Object> stringObjectMap : pointList) {
//stringObjectMap站点
String pointId = String.valueOf(stringObjectMap.get("P_ID"));
String taskId = table + "_" + pointId;
if (addTaskIdList.contains(taskId)) { //待添加到地图上的点
// 放在for循环之内,只有在需要添加的时候才获取
String latitude = String.valueOf(stringObjectMap.get("LATITUDE"));
String longitude = String.valueOf(stringObjectMap.get("LONGITUDE"));
Bitmap icon = IconDrawer.getInstance().getIcon(stringObjectMap, layerConfig);
BasePointInfo basePointInfo = new BasePointInfo();
basePointInfo.setLayerId(table);
basePointInfo.setPointId(pointId); //pointId来自map中的get("pointId")
basePointInfo.setLatitude(latitude + "");
basePointInfo.setLongitude(longitude + "");
basePointInfo.setIcon(icon);
basePointInfo.setMap(stringObjectMap);
toBeAddedList.add(basePointInfo);
//将点添加到activePointListMap中作为下次更新时的页面原始点
activePointMap.put(taskId, basePointInfo); // TODO: 2017/6/13
new Thread(new Runnable() {
@Override
public void run() {
iMapUse.addBasePoint(basePointInfo);
}
}).start();
}
}
long l22d = System.currentTimeMillis();
long l2djian = l22d - l2d;
Log.e("LayerConfig", "添加到地图上时间:" + l2djian);
}
long end2 = System.currentTimeMillis();
long ll = end2 - end1;
Log.e("LayerConfig", "完成总时间:" + ll);
}, throwable -> {
Log.e("LayerConfig", "通过查询sql语句查询点未获取成功");
});
}
网友评论