Android 학습 의 Flux 구조 입문

10082 단어 androidflux프레임
Flux 구조 소개
Flux 구 조 는 페 이 스 북 에 의 해 그들의 클 라 이언 트 웹 애플 리 케 이 션 을 구축 하 는 데 사용 된다.Clean Architecture 와 마찬가지 로 모 바 일 애플 리 케 이 션 을 위 한 디자인 은 아니 지만 그 특성 과 간단 함 은 안 드 로 이 드 프로젝트 에서 잘 활용 할 수 있 습 니 다.
Flux 모델 의 가장 큰 특징 은 단 방향 데이터 흐름 으로 UI 상태 업데이트 모델 은 MVC 모델 의 디자인 사상 을 계승 했다.Flux 는 구체 적 인 프레임 워 크 가 아니 라 UI 문 제 를 처리 하 는 모델 입 니 다.Android Flux 역시 구체 적 인 프레임 워 크 가 아 닙 니 다.새로운 코드 를 가 져 오 거나 통합 하지 않 아 도 사용 할 수 있 습 니 다.당신 이 해 야 할 일 은 이 사상 을 이해 하고 이런 개발 모델 에 따라 우리 가 제공 하 는 Android 코드 예제 를 찾 아 보고 자신의 코드 를 쓰 는 것 입 니 다.

Flux 를 이해 하려 면 두 가지 중요 한 특징 이 있 습 니 다.
1.데이터 흐름 은 항상 단 방향 이다.
      하나의 단 방향 데이터 흐름 은 Flux 구조의 핵심 이자 간단 하고 배우 기 쉬 운 원인 이다.아래 에서 논의 한 바 와 같이 응용 테스트 를 할 때 큰 도움 을 주 었 다.
2.응용 은 세 가지 주요 부분 으로 나 뉜 다.
     . View:응용 인터페이스.사용자 작업 에 응답 하 는action을 만 듭 니 다.
     . Dispatcher:중심 중추,모든 것action을 전달 하고 각각Store을 운송 하 는 것 을 책임 집 니 다.
     . Store:특정한application domain상 태 를 유지 합 니 다.이들 은 현재 상태 응답action에 따라 업무 논 리 를 수행 하 는 동시에 완성 할 때change사건 을 보 냅 니 다.이 이 벤트 는view인 터 페 이 스 를 업데이트 하 는 데 사 용 됩 니 다.
     이 세 부분 은 모두Action를 통 해 통신 한 것 이다.간단 한 기본 대상 은 유형 으로 구분 되 고 조작 과 관련 된 데 이 터 를 포함한다.
Flux Android 구조
안 드 로 이 드 개발 에서 Flux 디자인 규범 을 사용 하 는 목적 은 단순 성과 확장 이 쉬 운 테스트 사이 에 비교적 균형 적 인 구 조 를 구축 하 는 것 이다.
첫 번 째 단 계 는 Flux 요소 와 안 드 로 이 드 app 구성 요소 간 의 맵 을 찾 는 것 입 니 다.
그 중 두 요 소 는 매우 쉽게 찾 고 실현 된다.View: Activity o또는FragmentDispatcher: 하나의 이벤트 버스(event bus)는 제 예 에서 Otto 를 사용 하지만 다른 모든 실현 은 ok 이 어야 합 니 다.
ActionsActions복잡 하지 도 않다.그들의 실현 은POJO와 같이 간단 하고 두 가지 주요 속성 이 있다.
     1.Type:하나의 String 으로 이벤트 의 종 류 를 정의 합 니 다.
     2.Data:하나의 map,이번 작업 을 불 러 왔 습 니 다.
Store 는 Flux 이론 에서 가장 어 려 운 부분 이다.Stores응답Dispatcher이 보 낸Action,업무 논 리 를 집행 하고 보 낸change사건.Stores의 유일한 출력 은 이 단일 한 사건 이다.change내부 상태 에 관심 이 있 는 다른 구성 요 소 는 이 사건 을 감청 하고 필요 한 데 이 터 를 가 져 와 야 합 니 다.마지막 으로Store상 태 를 가 져 오 는 인 터 페 이 스 를 대외 적 으로 공개 해 야 한다.이렇게 하면stores요 소 는 조회application한 다음 에 해당 하 는 UI 를 업데이트 할 수 있다.
간단 한 데모 로 전체 절 차 를 설명 합 니 다.우리 인터페이스 에는 하나view와 하나Stores가 있 습 니 다.Button를 클릭 하면TextView에 문자 가 표 시 됩 니 다.일반적인 실현 은Button에서 논 리 를 직접 완성 하고TextView모델 은Activity층 에서 진행 하 며 Flux 구조 에 대해 우 리 는 어떻게 실현 해 야 합 니까?위의 그림 을 통 해 알 수 있 듯 이MVP발생Presenter한 다음 에View에 의 해 배치 되 고Action에 해당 하 는 처 리 를 통 해 데 이 터 를 나타 낸다.
어떻게 Action 을 생 성 합 니까?
일단Dispatcher이 어떤 건 지 알 아야 돼 요.

public class Action {

  private final String type;
  private final HashMap<String, Object> data;

  public Action(String type, HashMap<String, Object> data) {
    this.type = type;
    this.data = data;
  }

  public static Builder type(String type) {
    return new Builder().with(type);
  }

  public String getType() {
    return type;
  }

  public HashMap getData() {
    return data;
  }

  public static class Builder {
    private String type;
    private HashMap<String, Object> data;

    Builder with(String type) {
      if(type == null) {
        throw new IllegalArgumentException("Type may not be null.");
      }
      this.type = type;
      this.data = new HashMap<>();
      return this;
    }

    public Builder bundle(String key, Object value) {
      if (key == null) {
        throw new IllegalArgumentException("Key may not be null.");
      }
      if(value == null) {
        throw new IllegalArgumentException("Value may not be null.");
      }
      data.put(key, value);
      return this;
    }

    public Action build() {
      if (TextUtils.isEmpty(type)) {
        throw new IllegalArgumentException("At least one key is required.");
      }
      return new Action(type, data);
    }
  }
}
각각Store은 두 개의 속성 이 있 는데 하 나 는 표시Action하고 다른 필드 는 전 송 된 데 이 터 를 저장 하 며Action를 통 해 저장한다.Type에 대해 우 리 는 하나의 인터페이스 나 클래스 를 통 해 기록 하고 모든 유형 을 저장 할 수 있다.우리 의 호출 을 편리 하 게 하 다.

public interface ShowActions {
  String TODO_SHOW = "todo-show";
  String GET_TEXT = "get-text";
}
어떻게Map을 만 들 고 하나의 종 류 를 정의 하 며 우리 가 발생 할 수 있 는 각종Action Type사건 에 따라 각종Action을 정의 합 니까?

public class ActionsCreator {

  private static ActionsCreator instance;

  final Dispatcher mDispatcher;

  ActionsCreator(Dispatcher dispatcher){
    mDispatcher = dispatcher;
  }

  public static ActionsCreator get(Dispatcher dispatcher) {
    if (instance == null) {
      instance = new ActionsCreator(dispatcher);
    }
    return instance;
  }

  public void create(String text) {
    mDispatcher.dispatch(ShowActions.TODO_SHOW, ShowActions.GET_TEXT, text);
  }
우리 가ViewAction를 만 들 려 고 할 때 우 리 는 직접ActionsCreator이런 방식 으로 하지 않 고 스케줄 러 를 통 해 나 누 어 주 었 다.이곳 의 사건 배 포 는 우리 가 사용 하 는 것 은Actionnew Action로 사건 의 배 포 를 진행 하 는 것 이다.

public class Dispatcher {

  private final Bus bus;
  private static Dispatcher instance;

  Dispatcher(Bus bus){
    this.bus = bus;
  }

  public static Dispatcher get(Bus bus) {
    if (instance == null) {
      instance = new Dispatcher(bus);
    }
    return instance;
  }

  public void register(final Object cls) {
    bus.register(cls);
  }

  public void unRegister(final Object cls) {
    bus.unregister(cls);
  }

  public void emitChange(Store.StoreChangeEvent o) {post(o);}

  public void dispatch(String type, Object... data) {
    if(TextUtils.isEmpty(type)) {
      throw new IllegalArgumentException("Type must not be empty");
    }

    if (data.length % 2 != 0) {
      throw new IllegalArgumentException("Data must be a valid list of key");
    }

    Action.Builder actionBuilder = Action.type(type);
    for (int i = 0; i < data.length; i++) {
      String key = (String) data[i++];
      Object value = data[i++];
      actionBuilder.bundle(key, value);
    }
    post(actionBuilder.build());
  }

  private boolean isEmpty(String type) {
    return TextUtils.isEmpty(type);
  }

  private void post(final Object event) {
    bus.post(event);
  }
}
스케줄 링 과정 에서 우 리 는 전 달 된 데 이 터 를 분석 한 다음 에 데이터 에 따라 해당 하 는Otto을 만 든 다음 에Bus을 나 누 어 주 었 다.이때 해당 하 는ActionAction에 관심 을 가지 면 해당 하 는Action에 따라 해당 하 는 작업 을 수행 하기 시작 했다.Store에서 추상 적 인 방법Action을 성명 하여Store에 대한 판단 과 분 배 를 책임 지고onAction인 터 페 이 스 를 사건 변화 로 정의 했다.변화 가 있 을 때 이 를 통 해 전달 하면 우 리 는 스스로 이 인 터 페 이 스 를 실현 한 다음 에 그 안에 방법 과 필드 를 추가 하여 데 이 터 를 휴대 할 수 있다.

public abstract class Store {
  final Dispatcher mDispatcher;

  protected Store(Dispatcher dispatcher) {
    this.mDispatcher = dispatcher;
  }

  void emitStoreChange() {
    mDispatcher.emitChange(changeEvent());
  }

  abstract StoreChangeEvent changeEvent();

  public abstract void onAction(Action action);

  public interface StoreChangeEvent {}

}
사용자 정의 Store 클래스

public class ShowStore extends Store {

  private static ShowStore instance;
  private String showText;

  public ShowStore(Dispatcher dispatcher){
    super(dispatcher);
  }

  public static ShowStore get(Dispatcher dispatcher) {
    if (instance == null) {
      instance = new ShowStore(dispatcher);
    }
    return instance;
  }

  @Subscribe
  public void onAction(Action action) {
    switch (action.getType()) {
      case ShowActions.TODO_SHOW :
        showText = ((String)action.getData().get(ShowActions.GET_TEXT));
        Log.i("showText", showText);
        emitStoreChange();
        break;
      default:
        break;
    }
  }

  public String getShowText(){
    return showText;
  }

  @Override
  StoreChangeEvent changeEvent() {
    return new ShowChangeEvent();
  }

  public class ShowChangeEvent implements StoreChangeEvent {

  }
}
그 다음 에 우 리 는ActionStoreChangeEvent에서 변화 시간 을 구독 하 는 방법 이다.이 럴 때View중의 데이터 에 대한 동적 업 데 이 트 를 실현 할 수 있다.

 @Subscribe
  public void showText (ShowStore.ShowChangeEvent event){
    mTextView.setText(mShowStore.getShowText());
   }
총결산
Flux 구 조 를 통 해 사용 하 는 절 차 는 우리 의 View 이 벤트 는 데 이 터 를 가지 고 있 습 니 다.하나의 Actions Create 를 통 해 Type Action 을 만 듭 니 다.실제 완성 과정 은 Dispatcher 의 dispatch 에 있 습 니 다.그리고 이 Action 을 구독 한 Store 방법 에 버 리 고 여기 서 각종 논리,처 리 를 완성 하고 심지어 네트워크 요청 을 해서 데 이 터 를 얻 을 수 있 습 니 다.처리 가 완료 되면 결 과 를 하나의 이벤트 로 봉 할 수 있 습 니 다.그리고 이 이 벤트 는 스케줄 러 의 emitChangeEvent 를 통 해 이 벤트 를 구독 하 는 함수 에 전달 합 니 다.이 응답 이벤트 의 함 수 는 우리 View 에 정의 되 어 우리 View 에 대한 업 데 이 트 를 실현 합 니 다.이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 들 이 Flux 구 조 를 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기