Android 사용자 세 션 관리 디자인

모든 앱 이 로그 인해 야 한 다 는 것 을 잘 알 고 있 을 것 입 니 다.로그 인 정 보 는 로 컬 파일 에 저장 되 어 있 습 니 다.그리고 저 희 는 Shared Preferences 를 조작 하 는 코드 를 한 무더기 썼 습 니 다.
이제 당신 은 이러한 방법 을 완전히 버 리 고 코드 한 마디 로 로그 인 정보,사용자 정보 관 리 를 해결 할 수 있 습 니 다.전역 조작 을 실현 하 다.당신 의 프로그램 을 위해 결합 을 해제 합 니 다.

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 은 다음 과 같다.전체적인 사고방식 은 다음 과 같다.
Session Manager 클래스 를 추상 화하 면 실제 적 으로 Preferences Session Manager 가 이 추상 클래스 를 실현 하여 로 컬 Share Preferences 저장 을 합 니 다.

Config:실체 클래스 를 유지 하 는 class 는 JSON 직렬 화 를 통 해 로 컬 에 저장 합 니 다.이 클래스 는 일반적인 해석 역할 을 합 니 다.getUser()가 돌아 오 는 대상 은 이 클래스 에서 유지 합 니 다.결합 을 푸 는 역할 을 했 습 니 다.
ConfigBuild:빌 더 모드 로 편리 한 세 션 설정 을 제공 합 니 다.
SessionManager.getDefault(); 기본 값 은 Preferences Session Manager 의 인 스 턴 스 를 되 돌려 줍 니 다.
2.사용자 정의 SessionManger
Share Preferences 로 사용자 정 보 를 저장 하지 않 으 려 면 Session Manger 류 를 계승 하여 추상 적 인 방법 으로 사용자 정의 Session 관 리 를 실현 할 수 있 습 니 다.
사용자 정의 가 전역 에 접근 하고 싶다 면 AppSession Manger 클래스 를 추가 하여 하나의 방법 을 실현 하고 사용자 정의 실현 으로 돌아 갈 수 있 습 니 다.
Session Manger.getDefault()의 실현 을 참고 하면 됩 니 다.
3.Session Manger 코드 구현

/**
 *     
 * 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
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 안 드 로 이 드 사용자 세 션 관리의 디자인 방안 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기