91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android 用戶Session管理的設計方案

發布時間:2020-10-20 12:18:32 來源:腳本之家 閱讀:161 作者:mrr 欄目:移動開發

相信大家都知道,每一個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保存。

Android 用戶Session管理的設計方案

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管理的設計方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

象州县| 武山县| 新化县| 栖霞市| 昆明市| 鱼台县| 克山县| 和政县| 武夷山市| 定南县| 甘孜| 江源县| 区。| 河南省| 大关县| 平陆县| 田东县| 志丹县| 沁源县| 新巴尔虎左旗| 精河县| 曲周县| 临海市| 社旗县| 株洲县| 东乡县| 嘉兴市| 文登市| 阳高县| 贡山| 江川县| 光山县| 五台县| 永顺县| 西平县| 沿河| 东兴市| 东山县| 加查县| 崇礼县| 连江县|