- SP在xml中存储数据,适合数据量小的情况使用
- 在第一次读取数据时需要阻塞等待xml文件加载完成,如果数据量很大,速度会很慢
- SP每次都是全量写入,也就是说SP在每次写入数据之前都会把xml文件改名为备份文件,然后再将内存中的数据与新增数据合并再写入到新的xml文件中,如果执行成功再将备份xml文件删除,这样效率太低了。
- SP存储数据时是一次性将所有数据全量存储在xml中,而不是增量存储(即使只新增接一个键值对数据)。
- commit和apply的区别是commit返回值是boolean代表是否提交成功,apply没有返回值,commit是在当前线程中写入磁盘文件说法是不准确的,大多数场景下commit和apply都是通过另起单线程写到磁盘文件中的。
- 每次apply的提交都会造成QueueWork.add(Runnable),在异步线程写入磁盘文件完成后会调用QueueWork.remove(Runnable),观察线上ANR发现有大量QueueWoker.waitToFinish()的异常信息,所以需要实现自己的SP(继承自系统SharePreferenceImpl,在apply方法中不再调用QueueWork添加写磁盘Runnable,而是创建线程池开启线程去执行Runnable,这样就不会造成阻塞)。
网友评论