Android客户端开发 — SharedPreferences常见面试题

1. SharedPreferences存储安全风险源于?

答:(1)开发者在创建文件时没有正确的选取合适的创建模式(MODE_PRIVATE、MODE_WORLD_READABLE以及MODE_WORLD_WRITEABLE)进行权限控制;
(2)开发者过度依赖Android系统内部存储安全机制,将用户信息、密码等敏感重要的信息明文存储在Shared Preferences文件中,导致攻击者可通过root手机来查看敏感信息。

2. 每次调用getSharedPreferences时都会创建一个SharedPreferences对象吗?这个对象具体是哪个类对象?

答:不是,只要name相同,就会返回同一个SharedPreferencesImpl对象,packagePrefs存放文件name与SharedPreferencesImpl键值对,sSharedPrefs存放包名与ArrayMap键值对。注意sSharedPrefs是static变量,也就是一个类只有一个实例,因此每次getSharedPreferences其实拿到的都是同一个SharedPreferences对象。

3. 在UI线程中调用getXXX有可能导致ANR吗?

答:有可能的,getXXX之前,会给当前线程加锁,如果sp文件特别大,查询非常耗时的时候,有可能ANR。

4. 为什么SharedPreferences只适合用来存放少量数据,为什么不能把SharedPreferences对应的xml文件当成普通文件一样存放大量的数据?

答:其实这个和第三个问题没什么区别,因为SharedPreferences是整个文件都加载到内存中,文件太大了会对内存造成压力。

5. commit和apply有什么区别?(网易互娱面试原题)

答:①commit和apply虽然都是原子性操作,但是原子的操作不同,commit是原子提交到数据库,所以从提交数据到存在Disk中都是同步过程,中间不可打断。
②而apply方法的原子操作是原子提交到内存中,而非数据库,所以在提交到内存中时不可打断,之后再异步提交数据到数据库中,因此也不会有相应的返回值。
③所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败。
④commit发生在UI线程,而apply发生在工作线程。
⑤在不关心提交结果是否成功的情况下,优先考虑apply方法。
(commit()方法会同步地将偏好值(Preference)直接写入持久化存储设备,而apply()方法会立即把修改内容提交到SharedPreferences内容缓存中,然后开始异步的将修改提交到存储设备上,在这个过程中,开发者不会察觉到任何错误问题)

6. apply一定安全吗?

答:不一定。虽然apply使写入文件操作发生在工作线程中,这样防止IO操作阻塞UI线程。假如我们apply非常多的任务,而线程池队列是串行执行,当我们关闭Activity时:会检查线程池队列中任务是否已经全部执行完成,否则一直等到全部执行完成。如果此时等待超过5s,会造成程序崩溃。

7. SharedPreferences每次写入时是增量写入吗?

答:不是,SharedPreferences每次写入都是整个文件重新写入,不是增量写入。SharedPreferences在写入时会把之前的xml文件改名成一个备份文件,然后再将要写入的数据写入到一个新的文件中,如果这个过程执行成功的话,就会把备份文件删除。由此可见每次即使只是添加一个键值对,也会重新写入整个文件的数据,这也说明SharedPreferences只适合保存少量数据,文件太大有性能问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin&Amy

感谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值