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
相关产品推荐
相关产品推荐

