如何重构try/catch块中的if/else语句,消除重复的方法调用?
优化方案
你遇到的重复调用问题可以通过成功状态标记+统一降级逻辑的方式解决,优化后的代码如下:
private void getLatitudeAndLongitudeFromZipcode() { String zipcode = mSharedPreferences.getString("Zipcode", ""); boolean isFetchSuccess = false; // 空邮编直接走降级逻辑,避免无效请求 if (TextUtils.isEmpty(zipcode)) { getOldZipcodeLocation(); return; } try { List<Address> address = geocoder.getFromLocationName(zipcode, 1); if (address != null && !address.isEmpty()) { Address first = address.get(0); mLatitude = first.getLatitude(); mLongitude = first.getLongitude(); mCurrentLocationName = getLocationAsName(); // 合并两次Editor操作为一次,减少对象创建 mSharedPreferences.edit() .putLong("oldLat", Double.doubleToRawLongBits(mLatitude)) .putLong("oldLong", Double.doubleToRawLongBits(mLongitude)) .apply(); isFetchSuccess = true; } } catch (IOException e) { // 可替换为项目内统一日志工具,方便排查问题 e.printStackTrace(); } // 所有获取失败的场景统一触发降级逻辑,仅保留一处调用 if (!isFetchSuccess) { getOldZipcodeLocation(); } }
主要优化点
- 消除重复的
getOldZipcodeLocation()调用:通过isFetchSuccess标记位统一识别所有获取坐标失败的场景,仅保留一处降级逻辑调用,后续如果要修改降级逻辑也只需要改一次。 - 简化非空判断:把原来的三目运算判空改为更易读的
address != null && !address.isEmpty()写法,逻辑更直观。 - 合并SharedPreferences操作:原来的两次
edit()会创建两个Editor对象,合并为一次链式调用,性能更优。 - 增加无效请求拦截:提前判断邮编为空的场景,直接走降级逻辑,不需要调用地理编码接口,减少不必要的性能损耗。
额外优化建议
Geocoder.getFromLocationName是阻塞IO操作,不要在主线程执行这段代码,建议放到子线程、WorkManager或者协程中执行,避免触发ANR。- 极端场景下旧坐标也可能不存在,可以给
getOldZipcodeLocation()补充状态返回值,处理坐标完全获取失败的兜底逻辑。 - 生产环境建议替换
e.printStackTrace()为项目内统一的日志埋点,方便线上问题排查。
内容的提问来源于stack exchange,提问作者Ely Jacobi
相关产品推荐
相关产品推荐

