面试题答案
一键面试数据批量处理
- 策略阐述:避免频繁地读写SharedPreferences,而是将多个数据修改操作集中起来,一次性提交。因为每次读写SharedPreferences都涉及I/O操作,频繁操作会严重影响性能。
- 代码实现:
// 获取SharedPreferences实例
SharedPreferences sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
// 获取Editor
SharedPreferences.Editor editor = sharedPreferences.edit();
// 批量添加数据
editor.putString("key1", "value1");
editor.putInt("key2", 2);
// 提交修改
editor.apply();
在Android中,apply()
方法是异步提交,适用于批量处理且对结果不要求即时生效的场景。如果需要确保修改立即生效,可以使用commit()
方法,但它是同步操作,可能会阻塞主线程,所以批量处理时尽量用apply()
。
缓存数据结构设计
- 策略阐述:合理设计缓存数据结构,减少冗余数据,避免复杂的数据嵌套。例如,如果数据具有层级关系,可以考虑使用JSON格式来组织数据,然后整体存储,这样相比于逐个存储每个层级的子数据,能减少SharedPreferences中键值对的数量,提高读写效率。
- 代码实现:
// 假设数据结构为一个包含用户信息的类
class User {
String name;
int age;
List<String> hobbies;
public User(String name, int age, List<String> hobbies) {
this.name = name;
this.age = age;
this.hobbies = hobbies;
}
}
// 将User对象转换为JSON字符串
Gson gson = new Gson();
User user = new User("John", 30, Arrays.asList("reading", "swimming"));
String userJson = gson.toJson(user);
// 存储JSON字符串到SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("user_info", userJson);
editor.apply();
// 读取数据并转换回User对象
String storedUserJson = sharedPreferences.getString("user_info", null);
if (storedUserJson != null) {
User retrievedUser = gson.fromJson(storedUserJson, User.class);
}
这里使用了Google的Gson库来处理JSON数据的序列化和反序列化。
数据分块存储
- 策略阐述:将大量数据按一定规则分成多个小块进行存储,避免单个SharedPreferences文件过大。例如,按照数据的类别或者时间范围进行分块。这样在读取部分数据时,不需要加载整个大文件,提高了读取特定数据的效率。
- 代码实现:
// 假设按时间范围分块存储数据,以每天的数据为例
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy - MM - dd");
String today = dateFormat.format(new Date());
// 获取不同日期对应的SharedPreferences实例
SharedPreferences sharedPreferences = getSharedPreferences("data_" + today, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("daily_data_key", "daily_data_value");
editor.apply();
这里通过日期来区分不同的数据块,每个日期对应一个独立的SharedPreferences文件。
定期清理缓存
- 策略阐述:对于不再使用或者过期的数据,定期进行清理,防止缓存持续膨胀,从而影响性能。例如,可以设置一个有效期,当数据存储时间超过有效期时,在下次使用缓存时进行清理。
- 代码实现:
// 获取SharedPreferences实例
SharedPreferences sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
long lastUpdateTime = sharedPreferences.getLong("last_update_time", 0);
long currentTime = System.currentTimeMillis();
// 假设有效期为一天(86400000毫秒)
if (currentTime - lastUpdateTime > 86400000) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.putLong("last_update_time", currentTime);
editor.apply();
}
这里在每次使用缓存时检查数据是否过期,如果过期则清除所有数据并更新最后更新时间。