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

相关文章推荐

Favor库简述

Favor是一个第三方库, 可以简化SharedPreferences, 使用依赖注入的方式声明. 我们根据常见的输入框, 把账户信息存在Favor的类中, 来看看这个库怎么用. 1. 准备配置bui...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android SharedPreferences使用以及原理详解

概述 SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换...

Rx Preferences 简单整理

Rx Preferences 如何使用呢? 创建: SharedPreferences preferences = PreferenceManager.getDefaultSha...

RXAndroid之RxSharedPreference的使用

//创建sharedPreference实例 SharedPreferences mySP = getApplicationContext().getSharedPreferences...

Android数据存储方式:SharePreference、SQLite、ContentProvider有什么不同?

在Android中一共提供了4种数据存储方式,由于Android中数据基本是私有的,如果需要在其他应用程序中使用这些数据,就要使用Android提供的ContentProviders。 Androi...

SharePreference与File详解

  • 2011年03月19日 16:06
  • 109KB
  • 下载

android用sharepreference保存输入框中的内容

package com.cia.settings; import android.app.Activity; import android.content.SharedPreference...
  • MYBOYER
  • MYBOYER
  • 2013年08月08日 14:29
  • 1039
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SharePreference框架Favor详解
举报原因:
原因补充:

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