MST

星途 面试题库

面试题:Flutter 中 SharedPreferences 存储复杂数据结构之性能优化

当使用 SharedPreferences 存储大量复杂数据结构时,可能会遇到性能问题。描述一下你会采取哪些策略来优化性能,比如如何减少读写操作对应用性能的影响,以及怎样合理组织数据结构以提高存储和读取效率。请结合实际场景举例说明。
42.3万 热度难度
前端开发Flutter

知识考点

AI 面试

面试题答案

一键面试

减少读写操作对应用性能的影响

  1. 批量操作
    • 说明:避免频繁的单个读写操作,而是将多个相关数据的读写操作合并成一批。例如,在一个用户设置界面,用户可能同时修改多个设置项(如字体大小、主题颜色、是否开启通知等)。可以在用户点击“保存”按钮后,一次性将所有修改的数据写入SharedPreferences
    • 代码示例
SharedPreferences.Editor editor = getSharedPreferences("settings", MODE_PRIVATE).edit();
editor.putInt("font_size", 16);
editor.putString("theme_color", "blue");
editor.putBoolean("notification_enabled", true);
editor.apply();
  1. 缓存策略
    • 说明:在内存中缓存从SharedPreferences读取的数据。对于一些不经常变化的数据(如应用的初始配置,在应用运行期间基本不会改变),在第一次读取后将其缓存起来,后续需要使用时优先从缓存中获取,减少对SharedPreferences的读取次数。
    • 代码示例
private static Map<String, Object> cache = new HashMap<>();
public static Object getFromCache(String key) {
    return cache.get(key);
}
public static void putInCache(String key, Object value) {
    cache.put(key, value);
}
// 读取数据方法
public static Object readFromSharedPreferences(String key, SharedPreferences sp) {
    Object value = getFromCache(key);
    if (value == null) {
        if (sp.contains(key)) {
            // 假设这里是读取字符串类型数据
            value = sp.getString(key, null);
            putInCache(key, value);
        }
    }
    return value;
}

合理组织数据结构以提高存储和读取效率

  1. 数据分类存储
    • 说明:将不同类型或用途的数据分别存储在不同的SharedPreferences文件中。比如,将用户个人信息(如用户名、年龄、性别等)存储在user_info.xml,将应用的全局配置信息(如是否开启夜间模式、版本号等)存储在app_config.xml。这样可以避免在读取某一类数据时,读取整个大而复杂的SharedPreferences文件,提高读取效率。
    • 代码示例
// 存储用户信息
SharedPreferences.Editor userEditor = getSharedPreferences("user_info", MODE_PRIVATE).edit();
userEditor.putString("username", "JohnDoe");
userEditor.putInt("age", 25);
userEditor.putString("gender", "male");
userEditor.apply();

// 存储应用配置信息
SharedPreferences.Editor appEditor = getSharedPreferences("app_config", MODE_PRIVATE).edit();
appEditor.putBoolean("night_mode", false);
appEditor.putString("version", "1.0");
appEditor.apply();
  1. 使用更紧凑的数据表示
    • 说明:对于一些复杂数据结构,如果能用更紧凑的方式表示,可以减少存储空间并提高读写效率。例如,对于一组布尔值(如多个开关状态),可以使用位运算将多个布尔值存储在一个整数中。假设我们有三个开关switch1switch2switch3,可以这样存储:
    • 代码示例
boolean switch1 = true;
boolean switch2 = false;
boolean switch3 = true;
int combinedValue = (switch1? 1 : 0) | (switch2? 2 : 0) | (switch3? 4 : 0);
SharedPreferences.Editor editor = getSharedPreferences("switches", MODE_PRIVATE).edit();
editor.putInt("switch_states", combinedValue);
editor.apply();

// 读取时
SharedPreferences sp = getSharedPreferences("switches", MODE_PRIVATE);
int storedValue = sp.getInt("switch_states", 0);
boolean readSwitch1 = (storedValue & 1) != 0;
boolean readSwitch2 = (storedValue & 2) != 0;
boolean readSwitch3 = (storedValue & 4) != 0;