You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:27:04