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

Android:从其他类获取字符串数组,求更高效精简的实现代码

嘿,我懂你想要让两个AutoCompleteTextView的联动逻辑更高效精简的需求!结合Android开发的最佳实践,我整理了几个实用的优化方向,帮你把代码变得更简洁、易维护还能提升性能:

一、简化文本监听逻辑

原生的TextWatcher需要重写三个方法,大部分时候我们只需要用到afterTextChanged。我们可以自定义一个简化版的抽象类,避免冗余代码:

// 自定义简化版TextWatcher,只需要实现你关心的方法
public abstract class SimpleTextWatcher implements TextWatcher {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
}
二、添加防抖机制,避免频繁触发

用户快速输入时,频繁触发城市查询会浪费性能。我们可以用Handler做延迟执行,确保只有用户输入停止一段时间后才触发自动完成:

三、优化MainActivity中的联动逻辑

把城市自动完成的逻辑封装成独立的Runnable,代码更清晰,同时结合上面的优化点:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AutoCompleteTextView stateAcTv = findViewById(R.id.state);
        AutoCompleteTextView cityAcTv = findViewById(R.id.city);

        // 防抖用的Handler和任务
        Handler handler = new Handler(Looper.getMainLooper());
        Runnable cityAutoCompleteTask = () -> {
            String stateInput = stateAcTv.getText().toString().trim();
            if (stateInput.length() >= 2) {
                // 获取对应城市列表
                List<String> cities = ListCities.getCitiesByState(stateInput);
                // 设置适配器并触发弹窗
                ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(
                        this,
                        android.R.layout.simple_dropdown_item_1line,
                        cities
                );
                cityAcTv.setAdapter(cityAdapter);
                cityAcTv.showDropDown();
            } else {
                // 输入不足2字符时清空城市下拉列表
                cityAcTv.setAdapter(null);
            }
        };

        // 给State输入框添加监听
        stateAcTv.addTextChangedListener(new SimpleTextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
                // 移除之前的任务,避免重复触发
                handler.removeCallbacks(cityAutoCompleteTask);
                // 延迟300ms执行,可根据需求调整
                handler.postDelayed(cityAutoCompleteTask, 300);
            }
        });
    }
}
四、优化ListCities的查询性能

给城市列表添加缓存机制,避免重复查询相同州的城市数据,提升响应速度:

public class ListCities {
    // 缓存已查询过的州-城市映射,减少重复计算
    private static final Map<String, List<String>> STATE_CITY_CACHE = new HashMap<>();
    // 原始州-城市数据(可以替换成你的数据源)
    private static final Map<String, List<String>> STATE_TO_CITIES = new HashMap<>();

    static {
        // 初始化示例数据
        STATE_TO_CITIES.put("CA", Arrays.asList("Los Angeles", "San Francisco", "San Diego"));
        STATE_TO_CITIES.put("NY", Arrays.asList("New York", "Buffalo", "Rochester"));
        // 这里添加你的其他州数据
    }

    public static List<String> getCitiesByState(String state) {
        // 统一格式(比如转大写),避免大小写导致的重复查询
        String normalizedState = state.trim().toUpperCase();
        
        // 先查缓存,存在直接返回
        if (STATE_CITY_CACHE.containsKey(normalizedState)) {
            return STATE_CITY_CACHE.get(normalizedState);
        }
        
        // 缓存不存在则从原始数据获取,并存入缓存
        List<String> cities = STATE_TO_CITIES.getOrDefault(normalizedState, Collections.emptyList());
        STATE_CITY_CACHE.put(normalizedState, cities);
        return cities;
    }
}
优化亮点总结
  • 防抖处理:避免用户快速输入时频繁触发查询,减少不必要的性能消耗
  • 简化监听:自定义SimpleTextWatcher,去掉不需要的方法重写,代码更清爽
  • 缓存机制:复用已查询的城市数据,提升响应速度
  • 逻辑内聚:把城市自动完成的逻辑封装成独立任务,代码结构更清晰,便于后续维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:15:54