Android Maps Polyline无路线问题:如何避免传入null值?
嘿,这个问题我熟!当用Directions API获取路线时,确实会碰到找不到路线的情况,这时候直接传null给addPolyline肯定会出问题。咱们可以在两个关键环节做判断,完美避开这个坑,具体方案如下:
第一步:解析JSON前先检查API返回的状态码
Google Directions API的响应里自带status字段,用来标识请求是否成功。常见的失败状态有:
NOT_FOUND:起点或终点无法被识别ZERO_RESULTS:两地之间没有可行的路线(比如跨洋无交通路线)INVALID_REQUEST:请求参数有误(比如坐标格式不对)
所以你要先在parse方法里先检查这个状态码,只有当状态为"OK"时才继续解析,否则直接返回空列表,避免后续出现null:
class DirectionsJSONParser { /** Receives a JSONObject and returns a list of lists containing latitude and longitude */ List<List<HashMap<String, String>>> parse(JSONObject jObject) { List<List<HashMap<String, String>>> routes = new ArrayList<>(); JSONArray jRoutes; JSONArray jLegs; JSONArray jSteps; try { // 先拿状态码判断请求是否成功 String status = jObject.getString("status"); if (!"OK".equals(status)) { // 可以根据不同状态打日志,方便调试 Log.e("DirectionsError", "路线获取失败:" + status); return routes; // 返回空列表,而非null } jRoutes = jObject.getJSONArray("routes"); // 遍历所有路线(通常只有一条) for (int i = 0; i < jRoutes.length(); i++) { jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs"); List<HashMap<String, String>> path = new ArrayList<>(); // 遍历路段 for (int j = 0; j < jLegs.length(); j++) { jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps"); // 遍历每个步骤的polyline for (int k = 0; k < jSteps.length(); k++) { String polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points"); List<LatLng> list = decodePoly(polyline); // 把解码后的坐标存入HashMap for (int l = 0; l < list.size(); l++) { HashMap<String, String> hm = new HashMap<>(); hm.put("lat", Double.toString(list.get(l).latitude)); hm.put("lng", Double.toString(list.get(l).longitude)); path.add(hm); } } routes.add(path); } } } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { // 捕获其他异常,避免崩溃 Log.e("ParseError", "解析路线时出错:" + e.getMessage()); } return routes; } // 你的polyline解码方法(保持原有逻辑即可) private List<LatLng> decodePoly(String encoded) { // 原有的解码代码... } }
第二步:调用addPolyline前先验证结果有效性
当你调用parse方法拿到结果后,不要直接传给addPolyline,先判断返回的列表是否为空或者有效:
// 假设你已经拿到了API返回的JSONObject DirectionsJSONParser parser = new DirectionsJSONParser(); List<List<HashMap<String, String>>> routes = parser.parse(jsonObject); // 检查路线是否存在 if (routes != null && !routes.isEmpty()) { // 把HashMap列表转换成LatLng列表 List<LatLng> polylinePoints = new ArrayList<>(); for (List<HashMap<String, String>> path : routes) { for (HashMap<String, String> point : path) { double lat = Double.parseDouble(point.get("lat")); double lng = Double.parseDouble(point.get("lng")); polylinePoints.add(new LatLng(lat, lng)); } } // 创建Polyline并添加到地图 PolylineOptions polylineOpts = new PolylineOptions() .addAll(polylinePoints) .width(6) .color(Color.parseColor("#FF4081")); mMap.addPolyline(polylineOpts); } else { // 没有找到路线,给用户友好提示 Toast.makeText(getApplicationContext(), "无法找到两地之间的可行路线", Toast.LENGTH_SHORT).show(); }
额外优化小技巧
- 精准提示用户:根据不同的
status码给用户不同的提示,比如NOT_FOUND时提示“无法识别您输入的地点”,ZERO_RESULTS时提示“两地之间没有可通行的路线”。 - 提前校验请求参数:在发起API请求前,先检查起点和终点的坐标是否合法(比如纬度在±90之间,经度在±180之间),减少无效请求。
- 处理空指针:即使做了前面的判断,也尽量给
addPolyline传入非null的PolylineOptions,避免潜在的NullPointerException。
这样处理之后,就再也不会出现给addPolyline传null的情况了,同时还能提升用户体验~
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

