Android SharePreference框架Favor详解
2015-11-21 16:30
417 查看
@author 陈振阳
@date 2015-11-21
Favor封装了SharePreference,以注解的方式使用SP。
地址:http://cocosw.com/Favor/
Favor框架一共提供了四个注解:
从源码可以看出,Favor标签接收一个参数,可以指定存储到SP中的key的值。
注意
这里注意,getter方法不一定有get前缀。区分getter方法还是setter方法的唯一标准是有没有参数和返回值。例如:String city()就是getter方法,void city(String city)就是setter方法。
Favor给的例子上有这样一段代码:
可以看到setPassword是有返回值的,不要被误导,经过测试,setter方法的返回值是null。
getString的第二个参数,就是一个默认值,在从SP中取到key为city的值为null时,返回第二个参数提供的字符串。
用在setter方法上,默认情况下Favor使用editor.apply()方法提交更改,但是可以标识某个setter方法强制使用commit提交。
editor.apply()和editor.commit()的区别在于:
1. apply没有返回值而commit返回boolean表明修改是否提交成功
2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
3. apply方法不会提示任何失败的提示。
由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。
下面是Favor文档上的一个例子:
保存可序列化的对象时注意,Setter方法是不能提供默认值的。
使用方法如下:
@date 2015-11-21
Favor封装了SharePreference,以注解的方式使用SP。
地址:http://cocosw.com/Favor/
Favor框架一共提供了四个注解:
1.AllFavor
源码如下,标记一个类的所有的字段都被Favor管理,写入SP,从SP中读取。@Documented @Target(TYPE) @Retention(RUNTIME) public @interface AllFavor { }
2.Favor注解可以和
单独标记一个类中的某个方法上,这里注意,Favor注解可以和Default注解一起使用。注解在getter方法上。源码如下:@Documented @Target(METHOD) @Retention(RUNTIME) public @interface Favor { String value() default ""; }
从源码可以看出,Favor标签接收一个参数,可以指定存储到SP中的key的值。
注意
这里注意,getter方法不一定有get前缀。区分getter方法还是setter方法的唯一标准是有没有参数和返回值。例如:String city()就是getter方法,void city(String city)就是setter方法。
Favor给的例子上有这样一段代码:
@AllFavor public interface Account { @Default("No Name") String getUserName(); String setPassword(String password); }
可以看到setPassword是有返回值的,不要被误导,经过测试,setter方法的返回值是null。
3.Default
用在getter方法,相当于使用了PreferenceManager.getDefaultSharedPreferences(context).getString("city","default");
getString的第二个参数,就是一个默认值,在从SP中取到key为city的值为null时,返回第二个参数提供的字符串。
@Documented @Target(METHOD) @Retention(RUNTIME) public @interface Default { String[] value(); }
4.Commit
@Documented @Target(METHOD) @Retention(RUNTIME) public @interface Commit { }
用在setter方法上,默认情况下Favor使用editor.apply()方法提交更改,但是可以标识某个setter方法强制使用commit提交。
editor.apply()和editor.commit()的区别在于:
1. apply没有返回值而commit返回boolean表明修改是否提交成功
2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
3. apply方法不会提示任何失败的提示。
由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。
5.RxPreference
Favor还对RxPreference进行了封装,想了解更多可以看下RxAndroid和Rx Preferences的相关内容。6.高级用法
Favor支持所有的原生数据类型的put/get操作,包括int/long/float/String/bool,StringSet从0.2.0版本开始支持,可序列化的对象的保存加载还在测试中。下面是Favor文档上的一个例子:
public class Image implements Serializable { .... } @Favor Image image(); @Favor void setImage(Image image);
保存可序列化的对象时注意,Setter方法是不能提供默认值的。
7.工具方法
最后提供一个工具方法,进一步简化Favor的使用。public class SharePrefUtil { public static <T> T get(Context context,Class<T> tClass){ return new FavorAdapter.Builder(context).build().create(tClass); } }
使用方法如下:
Account account1 = SharePrefUtil.get(context,Account.class); String city1 = account.city("山东济南"); String city2 = account.city(); Logger.d("password:%s,username:%s", account1.getPassword(), account1.getUserName());
相关文章推荐
- Android Studio 打包、生成jks密钥、签名Apk、多渠道打包
- Android Studio 多渠道打包和一键完成(全部产品)打包并签名
- Android Studio AS 中配置强大的版本管理系统(Git、SVN、等)
- Android Studio 断点调试和高级调试
- Android 实现蘑菇街购物车动画效果
- Android Studio AS构建系统-Gradle
- [Android Studio AS添加第三方库的6种方式(Jar,module,so等)
- Android Studio 最实用的快捷键
- [Android]在android虚拟机中安装apk手机应用
- Android 窗口添加机制系列1-Activity
- Android手机上的返回键退出软件
- android突出当前应用程序的代码
- 安卓源码--切换阿拉伯语重启机器报错
- Android Studio配置教程
- JSP 、J2EE 、C# 、asp.net 、vb、VB.net、php、 Android,FPGA,MATLAB,QT,程序开发
- Android 金融项目整理
- 用Kotlin开发Android应用(II):创建新项目
- Android带多选功能的PhotoPicker
- Android带多选功能的PhotoPicker
- 通过Android trace文件分析死锁ANR