相信大家都知道,每一個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());
Log.i("rae", "登入資訊:" + token);
Log.i("rae", "使用者資訊:" + userInfo);
Log.i("rae", "是否登入:" + isLogin);
}
複製程式碼
初始化配置
// 這句請在Application onCreate 的時候呼叫初始化配置資訊
SessionManager.initWithConfig(
new SessionManager.ConfigBuilder()
.context(this)
.tokenClass(TokenInfo.class)
.userClass(UserInfo.class)
.build());
複製程式碼
自定義使用者資訊UserInfo實體類
預設的UserInfo
型別欄位不滿足需求?沒問題,完全可以自定義!
// 初始化配置資訊
SessionManager.initWithConfig(
new SessionManager.ConfigBuilder()
.context(this)
.tokenClass(MyTokenInfo.class) // 你自定義的TokenInfo類
.userClass(MyUserInfo.class) // 你自定義的UserInfo類
.build());
複製程式碼
引用庫:
compile 'com.rae.swift:rae-library:1.0.1'
複製程式碼
如果下載失敗,請在根目錄
build.gradle
新增:
allprojects {
repositories {
maven { url "https://dl.bintray.com/raee/Android" }
}
}
複製程式碼
一、設計
抽象工廠模式,整體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();
}
複製程式碼
本文結束,非常簡單的實現,但是卻非常實用!