将Android功能迁移至外部REST服务器后,如何适配LatLng类?
解决Android与服务端LatLng类不兼容的方案
1. 手动编写转换工具类
这是最直接的解决方式,通过提取两个类的核心坐标字段完成双向转换,注意两个类的字段命名差异:Android端是latitude/longitude,服务端是lat/lng。
Android端转服务端LatLng
public static com.google.maps.model.LatLng toServerLatLng(com.google.android.gms.maps.model.LatLng androidLatLng) { if (androidLatLng == null) return null; return new com.google.maps.model.LatLng(androidLatLng.latitude, androidLatLng.longitude); }
服务端转Android端LatLng
public static com.google.android.gms.maps.model.LatLng toAndroidLatLng(com.google.maps.model.LatLng serverLatLng) { if (serverLatLng == null) return null; return new com.google.android.gms.maps.model.LatLng(serverLatLng.lat, serverLatLng.lng); }
2. 定义通用DTO统一数据格式
如果涉及频繁跨端数据传递,可创建一个独立的坐标传输类作为中间载体,避免直接依赖两个不同的LatLng实现:
public class LatLngDTO { private double latitude; private double longitude; // 构造方法、Getter、Setter public LatLngDTO(double latitude, double longitude) { this.latitude = latitude; this.longitude = longitude; } // 从Android LatLng转换 public static LatLngDTO fromAndroid(com.google.android.gms.maps.model.LatLng androidLatLng) { return androidLatLng == null ? null : new LatLngDTO(androidLatLng.latitude, androidLatLng.longitude); } // 从服务端LatLng转换 public static LatLngDTO fromServer(com.google.maps.model.LatLng serverLatLng) { return serverLatLng == null ? null : new LatLngDTO(serverLatLng.lat, serverLatLng.lng); } // 转Android端LatLng public com.google.android.gms.maps.model.LatLng toAndroid() { return new com.google.android.gms.maps.model.LatLng(latitude, longitude); } // 转服务端LatLng public com.google.maps.model.LatLng toServer() { return new com.google.maps.model.LatLng(latitude, longitude); } }
后续跨端传递数据时统一使用LatLngDTO,降低模块耦合度。
3. 序列化/反序列化阶段处理字段映射
如果通过JSON传递坐标数据,可自定义序列化规则实现字段自动映射。以Gson为例,编写TypeAdapter处理适配:
public class AndroidLatLngAdapter extends TypeAdapter<com.google.android.gms.maps.model.LatLng> { @Override public void write(JsonWriter out, com.google.android.gms.maps.model.LatLng value) throws IOException { out.beginObject(); out.name("lat").value(value.latitude); out.name("lng").value(value.longitude); out.endObject(); } @Override public com.google.android.gms.maps.model.LatLng read(JsonReader in) throws IOException { in.beginObject(); double lat = 0, lng = 0; while (in.hasNext()) { switch (in.nextName()) { case "lat": lat = in.nextDouble(); break; case "lng": lng = in.nextDouble(); break; default: in.skipValue(); break; } } in.endObject(); return new com.google.android.gms.maps.model.LatLng(lat, lng); } }
注册该Adapter后,Android端即可直接与服务端的LatLng JSON格式兼容。
内容的提问来源于stack exchange,提问作者rejp
相关产品推荐
相关产品推荐

