Android Studio中通过Intent和Bundle传递坐标遇空指针崩溃求助
解决Activity间传递经纬度时Bundle为空的崩溃问题
嘿,我看你在两个Activity之间传经纬度时遇到了Bundle为空的空指针崩溃,这种情况我也碰到过几次,下面给你几个排查方向和替代方案:
一、先排查最基础的配置和代码疏漏
首先先排除几个最容易忽略的点:
- 确认
FinalRestaurant在Manifest里注册了:虽然你的错误是空指针,但如果Activity没注册,跳转时也会崩溃,先检查AndroidManifest.xml里有没有这个Activity的注册项:<activity android:name=".FinalRestaurant" /> - 检查
currentMarkerLocation是否为空:你在第一个Activity里用Toast打印了经纬度,但如果currentMarkerLocation本身是null的话,Toast会先崩溃,不过还是建议加个非空判断,避免后续逻辑出问题:if (currentMarkerLocation != null) { // 这里写传参和跳转的代码 } else { Toast.makeText(FindLocation.this, "当前位置未获取到", Toast.LENGTH_LONG).show(); } - 确认你调用了
startActivity(intent):很多时候写了Intent和Bundle,但忘了启动Activity,这也会导致后续逻辑异常,一定要确保在配置完Intent后调用了启动方法!
二、跳过Bundle,直接用Intent传参
既然用Bundle的方式出问题,不如试试直接用Intent的putExtra()方法,这种方式更简洁,也减少了一层封装可能带来的问题:
第一个Activity修改后的代码:
Intent intent = new Intent(FindLocation.this, FinalRestaurant.class); if (currentMarkerLocation != null) { // 直接把经纬度放到Intent里 intent.putExtra("LocationLat", currentMarkerLocation.latitude); intent.putExtra("LocationLng", currentMarkerLocation.longitude); Toast.makeText(FindLocation.this, currentMarkerLocation.latitude + ", " + currentMarkerLocation.longitude, Toast.LENGTH_LONG).show(); startActivity(intent); // 关键:启动Activity } else { Toast.makeText(FindLocation.this, "无法获取当前位置", Toast.LENGTH_LONG).show(); }
第二个Activity修改后的代码:
// 直接从Intent中获取,不用先拿Bundle // 第二个参数是默认值,建议选一个不太可能出现的数值,比如-999.0,避免和真实位置混淆 double lat = getIntent().getDoubleExtra("LocationLat", -999.0); double lng = getIntent().getDoubleExtra("LocationLng", -999.0); // 先判断是否拿到了有效数据 if (lat != -999.0 && lng != -999.0) { Toast.makeText(FinalRestaurant.this, lat + ", " + lng, Toast.LENGTH_LONG).show(); } else { Toast.makeText(FinalRestaurant.this, "未接收到位置数据", Toast.LENGTH_LONG).show(); }
三、排查Intent是否被意外修改
如果上面的方法还是不行,可能是你的Intent在传递前被其他代码修改了,比如有没有在startActivity之前调用了intent.setData()或者其他修改Intent的方法?另外如果是从Fragment中启动Activity,要确保用的是正确的上下文(比如getActivity())。
四、用ViewModel做共享数据(应急+推荐方案)
如果Intent传参的方式怎么都不行,可以试试用Jetpack的ViewModel来共享数据,这种方式不需要依赖Intent传递,适合这种简单的跨页面数据共享:
步骤1:创建共享ViewModel
import androidx.lifecycle.ViewModel; public class LocationShareViewModel extends ViewModel { private double currentLat; private double currentLng; public void saveLocation(double lat, double lng) { this.currentLat = lat; this.currentLng = lng; } public double getCurrentLat() { return currentLat; } public double getCurrentLng() { return currentLng; } }
步骤2:第一个Activity中存储数据
// 获取ViewModel实例 LocationShareViewModel viewModel = new ViewModelProvider(this).get(LocationShareViewModel.class); if (currentMarkerLocation != null) { // 存储经纬度 viewModel.saveLocation(currentMarkerLocation.latitude, currentMarkerLocation.longitude); // 启动第二个Activity Intent intent = new Intent(FindLocation.this, FinalRestaurant.class); startActivity(intent); }
步骤3:第二个Activity中读取数据
LocationShareViewModel viewModel = new ViewModelProvider(this).get(LocationShareViewModel.class); double lat = viewModel.getCurrentLat(); double lng = viewModel.getCurrentLng(); // 这里可以加个判断,比如如果是默认值0.0的话提示未获取到 Toast.makeText(FinalRestaurant.this, lat + ", " + lng, Toast.LENGTH_LONG).show();
最后再提个小建议:用默认值的时候别用0.0,因为0°纬度0°经度是真实存在的位置(大西洋几内亚湾附近),会干扰你判断是否真的拿到了数据,换成-999.0这种不太可能出现的数值会更靠谱。
内容的提问来源于stack exchange,提问作者Seyon Rajagopal
相关产品推荐
相关产品推荐

