美文网首页Android笔记本android基础知识
Android之不要滥用SharedPreference

Android之不要滥用SharedPreference

作者: 锐心凌志 | 来源:发表于2018-12-24 20:56 被阅读78次

    当我们第一次创建SharedPreferences时候,会将该变量置为false,然后开启线程将文件中的数据完成读取进map之后再将其置为true,读取文件的内容到map是在工作线程,此时edit方法是在主线程,如果此时工作线程读取时间过久,那edit方法将长时间处于等待状态。一旦超过5秒就会发生ANR危险。

    当我们首次创建SharedPreferences对象时,会根据文件名将文件下内容一次性加载到mMap容器中,每当我们edit都会创建一个新的EditorImpl对象,当修改或者添加数据时会将数据添加到mModifiled容器中,然后commit或者apply操作比较mMap与mModifiled数据修正mMap中最后一次提交数据然后写入到文件中。而get直接从mMap中读取。试想如果此时你存储了一些大型key或者value它们会一直存储在内存中得不到释放。

    四、正确使用的建议

    1、不要存放大的key和value在SharedPreferences中,否则会一直存储在内存中得不到释放,内存使用过高会频发引发GC,导致界面丢帧甚至ANR。

    2、不相关的配置选项最好不要放在一起,单个文件越大读取速度则越慢。

    3、读取频繁的key和不频繁的key尽量不要放在一起(如果整个文件本身就较小则忽略,为了这点性能添加维护得不偿失)。

    4、不要每次都edit,因为每次都会创建一个新的EditorImpl对象,最好是批量处理统一提交。

    否则edit().commit每次创建一个EditorImpl对象并且进行一次IO操作,严重影响性能。

    5、commit发生在UI线程中,apply发生在工作线程中,对于数据的提交最好是批量操作统一提交。虽然apply发生在工作线程(不会因为IO阻塞UI线程)但是如果添加任务较多也有可能带来其他严重后果(参照ActivityThread源码中handleStopActivity方法实现)。

    6、尽量不要存放json和html,这种可以直接文件缓存。

    7、不要指望这货能够跨进程通信 Context.PROCESS 。

    8、最好提前初始化SharedPreferences,避免SharedPreferences第一次创建时读取文件线程未结束而出现等待情况。

    荐:[http://www.cnblogs.com/mingfeng002/p/5970221.html](https://link.jianshu.com?
    t=http%3A%2F%2Fwww.cnblogs.com%2Fmingfeng002%2Fp%2F5970221.html)

    https://www.jianshu.com/p/8eb2147c328b

    相关文章

      网友评论

        本文标题:Android之不要滥用SharedPreference

        本文链接:https://www.haomeiwen.com/subject/mhdtlqtx.html