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

Android Studio中多输入项场景下Activity切换卡顿问题求助

问题分析

卡顿的核心原因是系统在Activity切换时会自动保存所有EditText的状态,当EditText数量超过一定阈值后,状态序列化操作会占用主线程大量时间,导致切换卡顿。即使改用循环生成EditText,本质还是大量EditText的状态保存问题,和RecyclerView无关。

解决方案

1. 禁用EditText的自动状态保存

既然已经通过Adapter自行维护EditText的文本数据,无需系统自动保存状态,直接关闭每个EditText的状态保存功能:

方式一:布局文件中设置

在item_campo.xml的两个EditText标签中添加属性:

android:saveEnabled="false"

方式二:代码中设置

在CampoViewHolder的构造方法中,给EditText设置:

etNombre.setSaveEnabled(false);
etValor.setSaveEnabled(false);

这样系统就不会再为这些EditText执行状态保存操作,能大幅减少Activity切换时的主线程耗时。

2. 优化Adapter的数据获取逻辑

当前getNombres()和getValores()方法每次调用都会循环创建新数组,虽不是卡顿主因,但可优化避免不必要性能损耗:
直接维护数组而非ArrayList,在数据更新时同步更新数组,避免每次调用都循环转换:

public class adapter extends RecyclerView.Adapter<adapter.CampoViewHolder> {
    private String[] nombres;
    private double[] valores;

    public adapter(int numCampos) {
        nombres = new String[numCampos];
        valores = new double[numCampos];
        Arrays.fill(nombres, "");
        Arrays.fill(valores, 0.0);
    }

    public void actualizarNombre(int posicion, String nuevoNombre) {
        nombres[posicion] = nuevoNombre;
    }

    public void actualizarValor(int posicion, double nuevoValor) {
        valores[posicion] = nuevoValor;
    }

    // 直接返回数组,无需循环转换
    public String[] getNombres() {
        return nombres;
    }

    public double[] getValores() {
        return valores;
    }

    // ... 其他代码保持不变
}

修改后,切换Activity时调用getNombres()和getValores()不会再执行循环创建数组的操作,减少额外主线程开销。

3. 额外优化:避免Activity切换前的冗余操作

检查onClick中的逻辑,确保没有其他主线程耗时操作。当前代码中获取Adapter数据的逻辑已足够简洁,后续扩展时需注意避免在startActivity前执行繁重计算。

验证效果

修改后,即使EditText数量较多,Activity切换时系统不再需要处理大量EditText的状态保存,卡顿问题会明显缓解甚至消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:33:14