相信大家都知道,每一個App都需要登錄,登錄信息都保存在本地文件中,然后我們就寫一堆的操作SharedPreferences的代碼了。
和靜網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),和靜網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為和靜上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的和靜做網(wǎng)站的公司定做!
現(xiàn)在,你可以完全拋棄這種方法,一句代碼搞定登錄信息,用戶信息管理。實現(xiàn)全局操作。為你的程序解耦。
public void sessionDemo() { // 獲取登錄信息 TokenInfo token = SessionManager.getDefault().getUserToken(); // 獲取用戶信息 UserInfo userInfo = SessionManager.getDefault().getUser(); // 是否登錄 boolean isLogin = SessionManager.getDefault().isLogin(); // 退出登錄 SessionManager.getDefault().clear(); // 登錄成功后,設(shè)置用戶信息 SessionManager.getDefault().setUser(new UserInfo()); // 登錄成功后,設(shè)置登錄信息 SessionManager.getDefault().setUserToken(new TokenInfo()); // 這句請在Application onCreate 的時候調(diào)用初始化配置信息 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); }
一、設(shè)計
抽象工廠模式,整體UML如下圖,整體思路為:
抽象出SessionManager類,實際還是PreferencesSessionManager實現(xiàn)了這個抽象類,進行本地SharePreferences保存。
Config:負責維護實體類的class,用來做JSON序列化保存到本地的。這個類起到泛型解析的作用,getUser()返回的對象就由這個類去維護了。從而達到了解耦的作用。
ConfigBuild:構(gòu)建者模式,提供方便的會話配置。
SessionManager.getDefault(); 默認返回的是PreferencesSessionManager的實例。
二、自定義SessionManger
如果不想用SharePreferences來保存用戶信息,也可以繼承SessionManger類實現(xiàn)抽象方法實現(xiàn)自定義的Session管理。
如果你的自定義也想全局訪問,那么可以新增一個AppSessionManger的類,來實現(xiàn)一個單例方法,返回你自定義的實現(xiàn)。
參考SessionManger.getDefault()的實現(xiàn)就可以了。
三、 SessionManger 代碼實現(xiàn)
/** * 會話管理 * 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(); /** * 獲取當前登錄的用戶信息,在調(diào)用該方法之前請先調(diào)用{@link #isLogin()}來判斷是否登錄 */ public abstract <T> T getUser(); /** * 設(shè)置當前用戶信息 */ public abstract <T> void setUser(T user); /** * 設(shè)置用戶授權(quán)信息 * * @param token 授權(quán)信息 */ public abstract <T> void setUserToken(T token); /** * 獲取用戶授權(quán)信息 */ public abstract <T> T getUserToken(); }
本文結(jié)束,非常簡單的實現(xiàn),但是卻非常實用!
GitHub開源:https://github.com/raee/retrofit-ext.git
總結(jié)
以上所述是小編給大家介紹的Android 用戶Session管理的設(shè)計方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!
文章題目:Android用戶Session管理的設(shè)計方案
網(wǎng)址分享:http://chinadenli.net/article4/ppeiie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站制作、標簽優(yōu)化、網(wǎng)站收錄、網(wǎng)頁設(shè)計公司、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)