基于apt实现的Android快速持久化框架:AptPreferences
AptPreferences是基于面向对象设计的快速持久化框架,目的是为了简化SharePreferences的使用,减少代码的编写。可以非常快速地保存基本类型和对象。AptPreferences是基于APT技术实现,在编译期间实现代码的生成,支持混淆。根据不同的用户区分持久化信息。
特点
- 把通过的Javabean变成SharedPreferences操作类
- 支持保存基本类型及对象
- 支持根据不同的用户区分持久化信息。
简单例子
定义javabean类
@AptPreferences
public class Settings {
private long loginTime;
private LoginUser loginUser;
// get、set方法
}
使用方式
//初始化
AptPreferencesManager.init(this, null);
// 保存信息
SettingsPreference.get().setLoginTime(System.currentTimeMillis());
SettingsPreference.get().set(new LoginUser("Wiki"));
// 获取信息
long loginTime = SettingsPreference.get().getLoginTime();
LoginUser loginUser = SettingsPreference.get().getLoginUser();
从上面的简单例子可以看到,我们需要做SharePreferences持久化,仅仅定义一个简单的javabean类(Settings)并添加注解即可,这个框架会根据javabean生成带有持久化功能的SettingsPreference类,通过这个类就可以非常简单去保持或者获取数据,大大简化了SharePreferences的使用,也可以保持对象。
项目地址
https://github.com/joyrun/AptPreferences
一、配置项目
配置项目根目录 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:1.5.0"
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
配置app build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
//...
dependencies {
compile 'com.github.joyrun.AptPreferences:aptpreferences:0.4.4'
apt 'com.github.joyrun.AptPreferences:aptpreferences-compiler:0.4.4'
}
二、定义持久化Javabean
使用方法非常简单,先编写一个普通带getter、setter的javabean类,在类头部添加@AptPreferences即可:
@AptPreferences
public class Settings {
private long lastOpenAppTimeMillis;
// 使用commit提交,默认是使用apply提交,配置默认值
@AptField(commit = true)
private String useLanguage = "zh";
// 使用preferences的方式保存
@AptField(preferences = true)
private Push push;
// 使用对象的方式保存
private LoginUser loginUser;
// 不持久化该字段,仅仅保留在内存
@AptField(save = false)
private long lastActionTimeMillis;
// ...
// get、set方法必须写
}
三、注解及使用说明
我们提供了两个注解@AptPreferences和@AptField(commit = false,save = true,preferences = false)。
@AptPreferences
被注解的javabean必须为字段实现setter和getter方法;
@AptField
AptField有三个参数可以配置。
commit:可以配置使用commit还是apply持久化,默认是apply,需要在一些需要立刻保存到文件的可以使用commit方式,比如在退出APP时保存退出的时间。
save:用来声明是否需要持久化这个字段。
preferences:这个属性仅仅适用于对象类型的字段,用来声明这个是以对象的方式保存,还是以preferences的方式保存。如果是true,就可以通过settingsPreference.getPush().isOpenPush()的方式存取。
global:默认是true,如果设置为false时,和AptPreferencesManager.setUserInfo()配合,可以为不同的用户进行持久化,达到每个用户有不用的设置。
四、初始化
使用之前要进行初始化,建议在Application进行初始化,需要需要保存对象,还需要实现对象的解析器,这里使用Fastjson作为实例:
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
AptPreferencesManager.init(this, new AptParser() {
@Override
public Object deserialize(Class clazz, String text) {
return JSON.parseObject(text,clazz);
}
@Override
public String serialize(Object object) {
return JSON.toJSONString(object);
}
});
}
}
五、根据不同的用户设置
如果app支持多用户登录,需要根据不用的用户持久化,可以通过下面方法配置。再通过@AptField(global = false),就可以针对某个字段跟随用户不同进行持久化。
AptPreferencesManager.setUserInfo("uid");
六、代码调用
// 普通类型保存
SettingsPreferences.get().setUseLanguage("zh");
SettingsPreferences.get().setLastOpenAppTimeMillis(System.currentTimeMillis());
// 对象类型保存
Settings.LoginUser loginUser = new Settings.LoginUser();
loginUser.setUsername("username");
loginUser.setPassword("password");
SettingsPreferences.get().setLoginUser(loginUser);
// 对象类型带 @AptField(preferences = true) 注解的保存,相当于把 push相关的放在一个分类
SettingsPreferences.get().getPush().setOpenPush(true);
// 获取
String useLanguage = settingsPreference.getUseLanguage();
Settings.LoginUser loginUser1 = settingsPreference.getLoginUser();
boolean openPush = settingsPreference.getPush().isOpenPush();
七、默认值
很多时候我们需要在没有获取到值时使用默认值,SharedPreferences本身也是具备默认值的,所以我们也是支持默认值配置。分析生成的代码可以看到:
@Override
public long getLastOpenAppTimeMillis() {
return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());
}
如果没有获取到值,会调用父类的方法,那么就可以通过这个方式配置默认值:
@AptPreferences
public class Settings {
// 使用commit提交,默认是使用apply提交,配置默认值
@AptField(commit = true)
private String useLanguage = "zh";
// ...
}
八、详细转换代码
@AptPreferences
public class Settings {
private long lastOpenAppTimeMillis;
// 使用commit提交,默认是使用apply提交,配置默认值
@AptField(commit = true)
private String useLanguage = "zh";
// 使用preferences的方式保存
@AptField(preferences = true)
private Push push;
// 使用对象的方式保存
private LoginUser loginUser;
// 不持久化该字段,仅仅保留在内存
@AptField(save = false)
private long lastActionTimeMillis;
public long getLastActionTimeMillis() {
return lastActionTimeMillis;
}
public void setLastActionTimeMillis(long lastActionTimeMillis) {
this.lastActionTimeMillis = lastActionTimeMillis;
}
public LoginUser getLoginUser() {
return loginUser;
}
public void setLoginUser(LoginUser loginUser) {
this.loginUser = loginUser;
}
public long getLastOpenAppTimeMillis() {
return lastOpenAppTimeMillis;
}
public void setLastOpenAppTimeMillis(long lastOpenAppTimeMillis) {
this.lastOpenAppTimeMillis = lastOpenAppTimeMillis;
}
public String getUseLanguage() {
return useLanguage;
}
public void setUseLanguage(String useLanguage) {
this.useLanguage = useLanguage;
}
public Push getPush() {
return push;
}
public void setPush(Push push) {
this.push = push;
}
public static class Push {
private boolean openPush;
private boolean vibrate;
private boolean voice;
public boolean isOpenPush() {
return openPush;
}
public void setOpenPush(boolean openPush) {
this.openPush = openPush;
}
public boolean isVibrate() {
return vibrate;
}
public void setVibrate(boolean vibrate) {
this.vibrate = vibrate;
}
public boolean isVoice() {
return voice;
}
public void setVoice(boolean voice) {
this.voice = voice;
}
}
public static class LoginUser implements Serializable{
public String username;
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
}
实际上就是根据上面的代码自动生成带有持久化的代码,可以在这里可以找到
app/build/generated/source/apt/debug
public final class SettingsPreferences extends Settings {
public static final Map<String, SettingsPreferences> sMap = new java.util.HashMap<>();
private final SharedPreferences.Editor mEdit;
private final SharedPreferences mPreferences;
private final String mName;
public SettingsPreferences(String name) {
mPreferences = AptPreferencesManager.getContext().getSharedPreferences("Settings_" + name, 0);
mEdit = mPreferences.edit();
this.mName = name;
this.setPush(new PushPreferences());
}
@Override
public Settings.LoginUser getLoginUser() {
String text = mPreferences.getString("loginUser", null);
Object object = null;
if (text != null) {
object = AptPreferencesManager.getAptParser().deserialize(com.thejoyrun.aptpreferences.Settings.LoginUser.class, text);
}
if (object != null) {
return (com.thejoyrun.aptpreferences.Settings.LoginUser) object;
}
return super.getLoginUser();
}
@Override
public void setLoginUser(Settings.LoginUser loginUser) {
mEdit.putString("loginUser", AptPreferencesManager.getAptParser().serialize(loginUser)).apply();
}
@Override
public long getLastOpenAppTimeMillis() {
return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());
}
@Override
public void setLastOpenAppTimeMillis(long lastOpenAppTimeMillis) {
mEdit.putLong("lastOpenAppTimeMillis", lastOpenAppTimeMillis).apply();
}
@Override
public String getUseLanguage() {
return mPreferences.getString("useLanguage", super.getUseLanguage());
}
@Override
public void setUseLanguage(String useLanguage) {
mEdit.putString("useLanguage", useLanguage).commit();
}
public static SettingsPreferences get(String name) {
if (sMap.containsKey(name)) {
return sMap.get(name);
}
synchronized (sMap) {
if (!sMap.containsKey(name)) {
SettingsPreferences preferences = new SettingsPreferences(name);
sMap.put(name, preferences);
}
}
return sMap.get(name);
}
public static SettingsPreferences get() {
return get("");
}
public void clear() {
mEdit.clear().commit();
sMap.remove(mName);
}
public static void clearAll() {
java.util.Set<String> keys = sMap.keySet();
for (String key : keys) {
sMap.get(key).clear();
}
}
private class PushPreferences extends Settings.Push {
@Override
public boolean isOpenPush() {
return mPreferences.getBoolean("Push.openPush", super.isOpenPush());
}
@Override
public void setOpenPush(boolean openPush) {
mEdit.putBoolean("Push.openPush", openPush).apply();
}
@Override
public boolean isVibrate() {
return mPreferences.getBoolean("Push.vibrate", super.isVibrate());
}
@Override
public void setVibrate(boolean vibrate) {
mEdit.putBoolean("Push.vibrate", vibrate).apply();
}
@Override
public boolean isVoice() {
return mPreferences.getBoolean("Push.voice", super.isVoice());
}
@Override
public void setVoice(boolean voice) {
mEdit.putBoolean("Push.voice", voice).apply();
}
}
}
License
Copyright 2016 Joyrun, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
基于apt实现的Android快速持久化框架:AptPreferences的更多相关文章
- android数据库持久化框架
android数据库持久化框架
- android数据库持久化框架, ormlite框架,
前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...
- 【开源项目3】Android快速开源框架--afinal
Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...
- 基于Retrofit+RxJava的Android分层网络请求框架
目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...
- Android下基于线程池的网络访问基础框架
引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...
- 60.Android通用流行框架大全
转载:https://segmentfault.com/a/1190000005073746 Android通用流行框架大全 1. 缓存 名称 描述 DiskLruCache Java实现基于LRU的 ...
- 15类Android通用流行框架
15类Android通用流行框架 Android流行框架 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 图片加载 Android Universal Image Loader 一个 ...
- 我的Android进阶之旅------>Android通用流行框架大全
Android通用流行框架大全 缓存 图片加载 图片处理 网络请求 网络解析 数据库 依赖注入 图表 后台处理 事件总线 响应式编程 Log框架 测试框架 调试框架 性能优化 本文转载于lavor的博 ...
- 基于.Net平台常用的组件和框架整理
转载自:http://www.cnblogs.com/hgmyz/p/5313983.html 基于转载进行补充 RPC框架: RPC:远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而 ...
随机推荐
- 递推 N矩形问题
Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格. Input 第一行输入一个t, 表示有t组数据,然后每行输入n,m,分别表示网格的 ...
- Big Number--hdu1018(数学)
http://acm.hdu.edu.cn/showproblem.php?pid=1018 题目大意 : 求一个数的阶乘的位数 公式log10(n!)=log10(1)+log10(2)+log1 ...
- 传值 属性 block 单例 协议
界面传值 四种传值的方式 1.属性传值(从前往后) 步骤: 1.属性传值用于第一个界面向第二个界面传值 2.明确二者联系的桥梁,也就是触发跳转的地方 3.明确传输的值,类型是什么 4.在第二个视图控制 ...
- [Chapter 3 Process]Practice 3.8: Describe the differences among short-term, medium-term, long-term scheduling
3.8 Describe the differences among short-term, medium-term, and longterm scheduling. 答案: 长期调度决定哪些进程进 ...
- python基础整理笔记(二)
一. 列表 1. 创建实例: a = [1,2,3] b = list() 2. 主要支持的操作及其时间复杂度如下: 3. 其他 python中的列表,在内存中实际存储的形式其实是分散的存储,比较类似 ...
- Remote Desktop Connection from Windows 7 to Ubuntu 12.04
$sudo apt-get install xrdp $cd ~ $sudo vim .xsession gnome-session --session=ubuntu-2d 在windows下进行远程 ...
- mysql语句:批量更新多条记录的不同值[转]
mysql语句:批量更新多条记录的不同值 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 帮助 1 UPDATE mytable SET myfield = 'value' WHERE ...
- RaisingStudio.PackageManager 发布 1.0版
从此免去命今行打包的痛苦,安装本Module后,可以在Dashbaord的Modules里看到一个Download页,进入可看到全部已安装模块列表(与Installed页内容一致),可搜索找到要打包的 ...
- 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序
小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...
- windows server 2012 r2 iis8.5 部署asp.net mvc4/5程序小结
windows server 2012 r2 iis8.5 部署asp.net mvc4/5程序小结 原文链接:http://www.xuanhun521.com/Blog/66d491f8-b479 ...