洞察金融行业需要转型,如何利用鸿蒙app开发提升运营效率
552
2022-10-28
基于apt实现的Android快速持久化框架:AptPreferences
AptPreferences是基于面向对象设计的快速持久化框架,目的是为了简化SharePreferences的使用,减少代码的编写。可以非常快速地保存基本类型和对象。AptPreferences是基于APT技术实现,在编译期间实现代码的生成,支持混淆。根据不同的用户区分持久化信息。
特点
把通过的Javabean变成SharedPreferences操作类支持保存基本类型及对象支持根据不同的用户区分持久化信息。
简单例子
定义javabean类
@AptPreferencespublic 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:3.1.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'//...dependencies { implementation 'com.github.joyrun.AptPreferences:aptpreferences:0.9.5' annotationProcessor 'com.github.joyrun.AptPreferences:aptpreferences-compiler:0.9.5'}
二、定义持久化Javabean
使用方法非常简单,先编写一个普通带getter、setter的javabean类,在类头部添加@AptPreferences即可:
@AptPreferencespublic 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有三个参数可以配置。
四、初始化
使用之前要进行初始化,建议在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本身也是具备默认值的,所以我们也是支持默认值配置。分析生成的代码可以看到:
@Overridepublic long getLastOpenAppTimeMillis() { return mPreferences.getLong("lastOpenAppTimeMillis", super.getLastOpenAppTimeMillis());}
如果没有获取到值,会调用父类的方法,那么就可以通过这个方式配置默认值:
@AptPreferencespublic class Settings { // 使用commit提交,默认是使用apply提交,配置默认值 @AptField(commit = true) private String useLanguage = "zh"; // ...}
八、详细转换代码
@AptPreferencespublic 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
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://apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations under the License.
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~