时间:2021-05-21
相信大家都知道,每一个App都需要登录,登录信息都保存在本地文件中,然后我们就写一堆的操作SharedPreferences的代码了。
现在,你可以完全抛弃这种方法,一句代码搞定登录信息,用户信息管理。实现全局操作。为你的程序解耦。
public void sessionDemo() { // 获取登录信息 TokenInfo token = SessionManager.getDefault().getUserToken(); // 获取用户信息 UserInfo userInfo = SessionManager.getDefault().getUser(); // 是否登录 boolean isLogin = SessionManager.getDefault().isLogin(); // 退出登录 SessionManager.getDefault().clear(); // 登录成功后,设置用户信息 SessionManager.getDefault().setUser(new UserInfo()); // 登录成功后,设置登录信息 SessionManager.getDefault().setUserToken(new TokenInfo()); // 这句请在Application onCreate 的时候调用初始化配置信息 SessionManager.initWithConfig( new SessionManager.ConfigBuilder() .context(this) .tokenClass(TokenInfo.class) .userClass(UserInfo.class) .build()); Log.i("rae", "登录信息:" + token); Log.i("rae", "用户信息:" + userInfo); Log.i("rae", "是否登录:" + isLogin); }一、设计
抽象工厂模式,整体UML如下图,整体思路为:
抽象出SessionManager类,实际还是PreferencesSessionManager实现了这个抽象类,进行本地SharePreferences保存。
Config:负责维护实体类的class,用来做JSON序列化保存到本地的。这个类起到泛型解析的作用,getUser()返回的对象就由这个类去维护了。从而达到了解耦的作用。
ConfigBuild:构建者模式,提供方便的会话配置。
SessionManager.getDefault(); 默认返回的是PreferencesSessionManager的实例。
二、自定义SessionManger
如果不想用SharePreferences来保存用户信息,也可以继承SessionManger类实现抽象方法实现自定义的Session管理。
如果你的自定义也想全局访问,那么可以新增一个AppSessionManger的类,来实现一个单例方法,返回你自定义的实现。
参考SessionManger.getDefault()的实现就可以了。
三、 SessionManger 代码实现
/** * 会话管理 * Created by ChenRui on 2017/4/28 0028 17:27. */public abstract class SessionManager { public static class Config { Class<?> userTokenClass; Class<?> userClass; Context context; } public static class ConfigBuilder { private final Config mConfig; public ConfigBuilder() { mConfig = new Config(); } public ConfigBuilder tokenClass(Class<?> cls) { mConfig.userTokenClass = cls; return this; } public ConfigBuilder userClass(Class<?> cls) { mConfig.userClass = cls; return this; } public ConfigBuilder context(Context applicationContext) { mConfig.context = applicationContext; return this; } public Config build() { return mConfig; } } private static Config sConfig; private static WeakReference<SessionManager> managerWeakReference; /** * 获取默认的会话管理器,默认的为cookie 管理器。 * 使用之前请使用{@link #initWithConfig(Config)} 来进行初始化配置。 */ public static SessionManager getDefault() { if (sConfig == null) { Log.w("SessionManager", "session config from default"); sConfig = new ConfigBuilder().tokenClass(SessionToken.class).userClass(SessionUserInfo.class).build(); } if (managerWeakReference == null || managerWeakReference.get() == null) { synchronized (SessionManager.class) { if (managerWeakReference == null || managerWeakReference.get() == null) { managerWeakReference = new WeakReference<SessionManager>(new PreferencesSessionManager(sConfig)); } } } return managerWeakReference.get(); } /** * 初始化会话管理器 */ public static void initWithConfig(Config config) { if (sConfig != null) { sConfig = null; System.gc(); } sConfig = config; } SessionManager() { } /** * 是否登录 */ public abstract boolean isLogin(); /** * 清除会话信息,即退出登录。 */ public abstract void clear(); /** * 获取当前登录的用户信息,在调用该方法之前请先调用{@link #isLogin()}来判断是否登录 */ public abstract <T> T getUser(); /** * 设置当前用户信息 */ public abstract <T> void setUser(T user); /** * 设置用户授权信息 * * @param token 授权信息 */ public abstract <T> void setUserToken(T token); /** * 获取用户授权信息 */ public abstract <T> T getUserToken();}本文结束,非常简单的实现,但是却非常实用!
GitHub开源:https://github.com/raee/retrofit-ext.git
总结
以上所述是小编给大家介绍的Android 用户Session管理的设计方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
针对详细的网页,设计方案与制做一样关键。网页设计方案和制做的新手很有可能不清楚简单网页建立和设计方案的操作步骤。更别说设计方案一个详细的网页了。那么,简单网
相关零跳出率的店面装修设计方案,在网上有很多,哪一个最有效?一、统一设计风格店面装修设计方案统一主页设计风格、设计方案合理布局是强制标准,假如你注重主页总体简约
要满足哪些条件才算的上是一个专业网站设计师呢?一个专业网站设计方案,当然必须寻找专业的设计师来对网站开展设计方案,那样才可以设计方案转让公司令人满意的网站,
长沙网站建设时,主页设计方案非常重要。用户浏览网站时,第一次见面是因为网站的首页。主页是网站给用户的第一印象。大家在建设长沙网站时,要非常重视主页的设计方案。其
网页制作基本建设对网页制作企业而言,是一个关键每日任务。针对网页制作,设计方案内容必须大家设计方案工作人员精心策划,不但要设计方案出简约、精练的网站,更要考