Android传递ArrayList<LatLng>触发空指针异常问题排查
解决LatLng列表跨Activity传递多元素时的空指针问题
核心问题定位
单个元素正常、多元素触发Class.isInterface()空指针,本质是Parcelable列表的传递/读取逻辑不匹配,或传递过程中存在元素空值、Intent复用的问题。
具体解决步骤
1. 规范传递侧(Util类)的Intent构建
确保每次创建新Intent,使用putParcelableArrayListExtra传递列表,同时校验元素非空:
public static void launchTargetActivity(Context context, ArrayList<LatLng> latLngList) { // 先校验列表及元素合法性 if (latLngList == null || latLngList.contains(null)) { Log.e("Util", "LatLng列表为空或包含空元素"); return; } // 每次创建新Intent,避免复用导致的数据异常 Intent intent = new Intent(context, TargetActivity.class); intent.putParcelableArrayListExtra("EXTRA_LATLNG_LIST", latLngList); context.startActivity(intent); }
2. 修正接收侧(TargetActivity)的读取逻辑
必须用getParcelableArrayListExtra直接读取,禁止用getParcelableArrayExtra手动转列表(多元素时易触发反序列化异常):
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); ArrayList<LatLng> receivedLatLngs = getIntent().getParcelableArrayListExtra("EXTRA_LATLNG_LIST"); // 判空后再操作 if (receivedLatLngs != null && !receivedLatLngs.isEmpty()) { // 处理列表逻辑 for (LatLng latLng : receivedLatLngs) { Log.d("TargetActivity", "接收坐标:" + latLng.latitude + "," + latLng.longitude); } } else { Log.w("TargetActivity", "未接收到有效LatLng列表"); } }
3. 排查自定义LatLng的Parcelable实现(非官方类时)
如果是你自己实现的LatLng而非Google Maps官方类,必须确保Parcelable序列化/反序列化逻辑完全正确,字段读写顺序一致:
public class LatLng implements Parcelable { private double lat; private double lng; public LatLng(double lat, double lng) { this.lat = lat; this.lng = lng; } // 反序列化构造函数 protected LatLng(Parcel in) { lat = in.readDouble(); lng = in.readDouble(); } public static final Creator<LatLng> CREATOR = new Creator<LatLng>() { @Override public LatLng createFromParcel(Parcel in) { return new LatLng(in); } @Override public LatLng[] newArray(int size) { return new LatLng[size]; } }; @Override public void writeToParcel(Parcel dest, int flags) { dest.writeDouble(lat); dest.writeDouble(lng); } @Override public int describeContents() { return 0; } // getter方法 public double getLat() { return lat; } public double getLng() { return lng; } }
(官方LatLng无需此操作,其Parcelable实现是可靠的)
4. 禁止复用全局Intent对象
如果Util类中使用了静态Intent变量复用,会导致多次调用时数据覆盖,必须每次创建新Intent对象(如步骤1所示)。
5. 日志定位空元素
如果问题仍存在,在传递前和接收后分别打印列表元素,确认是否有元素在传递过程中变为null:
- 传递侧打印:
for (int i = 0; i < latLngList.size(); i++) { Log.d("Util", "待传递元素[" + i + "]:" + latLngList.get(i)); }
- 接收侧打印:
if (receivedLatLngs != null) { for (int i = 0; i < receivedLatLngs.size(); i++) { Log.d("TargetActivity", "已接收元素[" + i + "]:" + receivedLatLngs.get(i)); } }
内容的提问来源于stack exchange,提问作者zxcisnoias
相关产品推荐
相关产品推荐

