Android 학습 의 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
또는Fragment
Dispatcher:
하나의 이벤트 버스(event bus)는 제 예 에서 Otto 를 사용 하지만 다른 모든 실현 은 ok 이 어야 합 니 다.Actions
Actions
복잡 하지 도 않다.그들의 실현 은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);
}
우리 가View
로Action
를 만 들 려 고 할 때 우 리 는 직접ActionsCreator
이런 방식 으로 하지 않 고 스케줄 러 를 통 해 나 누 어 주 었 다.이곳 의 사건 배 포 는 우리 가 사용 하 는 것 은Action
의new 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
을 나 누 어 주 었 다.이때 해당 하 는Action
Action
에 관심 을 가지 면 해당 하 는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 {
}
}
그 다음 에 우 리 는Action
즉StoreChangeEvent
에서 변화 시간 을 구독 하 는 방법 이다.이 럴 때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 구 조 를 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.