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

在Android的MVI/MVVM架构中能否统一管理指标、日志与错误弹窗?

在MVI/MVVM架构中实现统一点击事件异常处理的可行性

我们希望在Android应用中提供setPlatformClickListener(listener, "eventName")方法,强制所有开发者用它替代原生的setClickListener,该方法的实现代码如下(注意其中的POPUP_GENERIC_ERROR相关逻辑):

// 若了解指标体系,全局维度(标签)包括OS、版本、客户ID等,这些已在全局维度Map中设置
Map<String, String> dimensions = Map.of("name", eventName);

String requestId = UUID.randomUUID().toString();
Context.setMagic("RequestId", requestId);
// 这里的RequestId上下文绑定逻辑采用类似协程作用域数据传递的实现方式
try {
    metrics.increment("click.started", dimensions);
    // 执行开发者传入的点击监听器逻辑
    listener.invoke();
    metrics.increment("click.success", dimensions);
} catch(Exception e) {
    log.error("An error has occurred", e); // 请求ID会被自动记录到日志中
    dimensions.put("exception", e.getClass().getSimpleName());
    metrics.increment("click.failure", dimensions);
    POPUP_GENERIC_ERROR(requestId); // 所有日志(包括上方的错误日志)都携带RequestId,用户可以提供该ID协助排查问题
} finally {
    metrics.recordLatency("click.duration", dimensions, startTime);
    Context.remove("RequestId");
}

通用错误弹窗会弹出一个对话框,显示类似您遇到了一个错误。requestId: xxxxxx的内容,目前仅包含一个“确定”按钮。

我们的核心目标和多数GUI框架的实践一致:

  • 让开发者专注于成功路径的代码编写,将空指针等异常统一抛至上层处理;
  • 避免应用崩溃——Android的机制较为特殊,线程起始处抛出的任何异常都可能导致应用崩溃,我们困惑为何系统不提供一个简单的弹窗提示(比如“您遇到了一个bug,建议重启应用”)的默认选项。

请问在MVI或MVVM架构中,是否可以实现上述统一处理逻辑?还是说每个点击监听器都必须编写独立的错误处理代码?(这在拥有200+点击监听器的场景下会是一场噩梦)


内容的提问来源于stack exchange,提问作者Dean Hiller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:26:00