最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 用戶Session管理的設(shè)計(jì)方案

 更新時(shí)間:2017年12月12日 11:26:37   投稿:mrr  
這篇文章主要介紹了Android 用戶Session管理的設(shè)計(jì)方案,需要的朋友可以參考下

相信大家都知道,每一個(gè)App都需要登錄,登錄信息都保存在本地文件中,然后我們就寫一堆的操作SharedPreferences的代碼了。

現(xiàn)在,你可以完全拋棄這種方法,一句代碼搞定登錄信息,用戶信息管理。實(shí)現(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());
    // 這句請(qǐng)?jiān)贏pplication onCreate 的時(shí)候調(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è)計(jì)

抽象工廠模式,整體UML如下圖,整體思路為:

抽象出SessionManager類,實(shí)際還是PreferencesSessionManager實(shí)現(xiàn)了這個(gè)抽象類,進(jìn)行本地SharePreferences保存。

Config:負(fù)責(zé)維護(hù)實(shí)體類的class,用來做JSON序列化保存到本地的。這個(gè)類起到泛型解析的作用,getUser()返回的對(duì)象就由這個(gè)類去維護(hù)了。從而達(dá)到了解耦的作用。

ConfigBuild:構(gòu)建者模式,提供方便的會(huì)話配置。

SessionManager.getDefault(); 默認(rèn)返回的是PreferencesSessionManager的實(shí)例。

二、自定義SessionManger

如果不想用SharePreferences來保存用戶信息,也可以繼承SessionManger類實(shí)現(xiàn)抽象方法實(shí)現(xiàn)自定義的Session管理。

如果你的自定義也想全局訪問,那么可以新增一個(gè)AppSessionManger的類,來實(shí)現(xiàn)一個(gè)單例方法,返回你自定義的實(shí)現(xiàn)。

參考SessionManger.getDefault()的實(shí)現(xiàn)就可以了。

三、 SessionManger 代碼實(shí)現(xiàn)

/**
 * 會(huì)話管理
 * 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;
  /**
   * 獲取默認(rèn)的會(huì)話管理器,默認(rèn)的為cookie 管理器。
   * 使用之前請(qǐng)使用{@link #initWithConfig(Config)} 來進(jìn)行初始化配置。
   */
  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();
  }
  /**
   * 初始化會(huì)話管理器
   */
  public static void initWithConfig(Config config) {
    if (sConfig != null) {
      sConfig = null;
      System.gc();
    }
    sConfig = config;
  }
  SessionManager() {
  }
  /**
   * 是否登錄
   */
  public abstract boolean isLogin();
  /**
   * 清除會(huì)話信息,即退出登錄。
   */
  public abstract void clear();
  /**
   * 獲取當(dāng)前登錄的用戶信息,在調(diào)用該方法之前請(qǐng)先調(diào)用{@link #isLogin()}來判斷是否登錄
   */
  public abstract <T> T getUser();
  /**
   * 設(shè)置當(dāng)前用戶信息
   */
  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é)束,非常簡(jiǎn)單的實(shí)現(xiàn),但是卻非常實(shí)用!

GitHub開源:https://github.com/raee/retrofit-ext.git

總結(jié)

以上所述是小編給大家介紹的Android 用戶Session管理的設(shè)計(jì)方案,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填充

    Android實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填充

    這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)獲取短信驗(yàn)證碼并自動(dòng)填充的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • 利用OPENCV為android開發(fā)畸變校正的JNI庫方法

    利用OPENCV為android開發(fā)畸變校正的JNI庫方法

    今天小編就為大家分享一篇利用OPENCV為android開發(fā)畸變校正的JNI庫方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Android智能指針輕量級(jí)Light Pointer初識(shí)

    Android智能指針輕量級(jí)Light Pointer初識(shí)

    這篇文章主要為大家介紹了Android智能指針輕量級(jí)Light Pointer初識(shí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android開發(fā)設(shè)置RadioButton點(diǎn)擊效果的方法

    Android開發(fā)設(shè)置RadioButton點(diǎn)擊效果的方法

    這篇文章主要介紹了Android開發(fā)設(shè)置RadioButton點(diǎn)擊效果的方法,詳細(xì)分析了Android開發(fā)中RadioButton屬性功能及相關(guān)設(shè)置技巧,需要的朋友可以參考下
    2017-06-06
  • Android選擇圖片或拍照?qǐng)D片上傳到服務(wù)器

    Android選擇圖片或拍照?qǐng)D片上傳到服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了android選擇圖片或拍照?qǐng)D片上傳到服務(wù)器的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android自定義圓環(huán)式進(jìn)度條

    Android自定義圓環(huán)式進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義圓環(huán)式進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android系統(tǒng)的五種數(shù)據(jù)存儲(chǔ)形式實(shí)例(二)

    Android系統(tǒng)的五種數(shù)據(jù)存儲(chǔ)形式實(shí)例(二)

    Android系統(tǒng)有五種數(shù)據(jù)存儲(chǔ)形式,分別是文件存儲(chǔ)、SP存儲(chǔ)、數(shù)據(jù)庫存儲(chǔ)、contentprovider 內(nèi)容提供者、網(wǎng)絡(luò)存儲(chǔ)。本文介紹了Android系統(tǒng)的五種數(shù)據(jù)存儲(chǔ)形式,有興趣的可以了解一下。
    2016-12-12
  • 如何安裝adb工具及常用的adb命令

    如何安裝adb工具及常用的adb命令

    ADB全稱為Android Debug Bridge,起到調(diào)試橋的作用,是一個(gè)客戶端-服務(wù)器端程序,ADB 也是 Android SDK 中的一個(gè)工具,可以直接操作管理 Android 模擬器或者真實(shí)的 Android 設(shè)備,本文介紹如何安裝adb工具及常用的adb命令,感興趣的朋友一起看看吧
    2024-01-01
  • Flutter實(shí)現(xiàn)矩形取色器的封裝

    Flutter實(shí)現(xiàn)矩形取色器的封裝

    這篇文章主要為大家詳細(xì)介紹了Flutter實(shí)現(xiàn)矩形取色器的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android日期選擇器對(duì)話框DatePickerDialog使用詳解

    Android日期選擇器對(duì)話框DatePickerDialog使用詳解

    這篇文章主要為大家詳細(xì)介紹了Android日期選擇器對(duì)話框DatePickerDialog的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

潜江市| 板桥市| 五台县| 仙游县| 南郑县| 平陆县| 大宁县| 上饶县| 上栗县| 徐闻县| 文水县| 锦州市| 内乡县| 江口县| 定西市| 襄垣县| 安陆市| 贺兰县| 和政县| 日土县| 永平县| 黄石市| 五莲县| 靖江市| 那坡县| 阳谷县| 伊金霍洛旗| 龙州县| 本溪市| 东兰县| 香格里拉县| 洛隆县| 琼海市| 乌鲁木齐市| 邛崃市| 新乐市| 庆阳市| 奉节县| 晋城| 建德市| 郎溪县|