【第22期】观点:IT 行业加班,到底有没有价值?

Android SharePreference框架Favor详解

原创 2015年11月21日 16:30:12

@author 陈振阳
@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());
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

ORM框架学习记录

根据SpringSide4中涉及到的ORM框架,针对具体实践进行学习,做出比较和总结,以便在实际系统架构设计中能够更好地选择。 Spring Data JPA 概述 Spring Dat...

深入 Spring 系列之静态资源处理

前一段时间,WebIDE 开源的过程中,无意间接触到 webjars,觉得比较有趣,于是研究并整理了一下。webjars 是将前端的库(比如 jQuery)打包成 Jar 文件,然后使用基于 JVM ...

仿美团实现地域选择(二)

介绍上篇实现了PopupWindow选择地域,这篇介绍如何实现带有首字母的快速索引list,进行城市选择,我也是参考了相关博文才弄出来的,知道了原理,才发现如此简单。其中有个开源项目可以参考,但与本文...

异常流和程序流

研究了下Shiro的源码,发现里面用了大量的异常去控制程序流程。 鉴权的方法,具体看注释//鉴权处理的方法,这个方法会将鉴权过程中出现的异常抛出来 protected abstract Authen...

JavaScript 图片URL转DataURL,DataURL转Blob

问题描述封装WebUploader,想实现信息修改的功能,就是一条记录可能有多个图片字段,每个字段又有可能有多张图片。当修改记录的时候,需要把图片字段中已经有的图片显示出来,实现旋转角度的功能,最重要...

Hadoop指标框架V2

Package org.apache.hadoop.metrics2 Metrics 2.0 Interface Summary MetricsCollector ...

SymmetricDS文档翻译--【Chapter 3. 详细配置(Configuration)[section A]】

Chapter 3. Configuration 3.1. Groups Groups 定义在NODE_GROUP表中。下面的SQL语句将分别为分销商店例子中的“corp”和“store”创建一个节点...

SymmetricDS文档翻译--【Chapter 1. 简介(Introduction)】

本用户指南将简要介绍SymmetricDS配置中基础的和高级的概念。读完本指南,你将对SymmetricDS的能力和其中的概念有一个更好的理解。 1.1.   System Requirements ...

Java不同压缩算法的性能比较

文章转自:http://it.deepinmind.com/java/2015/01/04/performance-general-compression.html 本文将会对常用的几个压缩...

Android下利用SharePreference存储序列化对象的方法

在Android下做持久化的数据存储,大部分是用到了sqlite数据库或者sharepreference。当然我们为了图方便,少写sql语句,大部分都是用ORM形式的开源数据库框架,例如greenda...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)