Android 구조의 MVP, MVVM 에 대해 간단히 이야기 하 다.

다음으로 전송:http://www.cnblogs.com/BoBoMEe/p/5573447.html
개술MVP(Model-View-Presenter) 는 전통 MVC(Model-View-Controller) 이 안 드 로 이 드 개발 에서 의 변 종 · 진화 모델 이다.주로 UI, UI 논리 와 업무 논리, 데 이 터 를 격 리 하고 느슨 한 결합 을 만들어 다시 사용 할 수 있 는 대상 을 만 듭 니 다.
우 리 는 View 층 이 쉽게 변화 하고 다양 하 며 업무 논리 도 다양 하 다 는 것 을 알 고 있다. 전통 적 인 MVC 에 비해 P 는 C 의 역할 을 한다. Model 은 데 이 터 를 저장 하고 View 는 Model 의 표현 을 나타 내 며 Presenter 는 이들 의 통신 을 조율 한다.
그 후에 MVP 를 바탕 으로 일부 변종 이 나 타 났 다. 예 를 들 어 MVVM, MVP 등 은 MVP 에 비해 MVVM 은 데이터 연결 을 더욱 간단하게 만 들 었 다. MVP VM 은 MVVM 에 Presenter 층 도입 을 추가 했다.
MVC, MVP, MVVM, MVP 도해
원본 블 로그 와 사진 제공 자 에 게 감 사 드 립 니 다.
MVC:
MVC 에서 View 는 이 벤트 를 받 아들 이 고 Controller 를 호출 하여 Model 을 조작 하 는 동시에 Model 인 스 턴 스 의 데이터 가 변 하면 Controller 는 인터페이스 (물론 View 도 Model 을 직접 업데이트 할 수 있 습 니 다) 를 업데이트 합 니 다.
전통 적 인 개발 에서 Activity 는 Controller 역할 도 하고 View 역할 도 하 는 것 과 같다. 사용자 의 응답 조작 모델 도 받 아들 여야 하고 인터페이스 도 업데이트 해 야 한다. 이렇게 하면 데이터 의 업데이트 가 간단 해 졌 지만 단점 도 뚜렷 하 다. Activity 는 비대 하고 후기 에 유지 하기 어렵다.
MVP:
MVP 는 업무 논 리 를 단독으로 Presenter 를 추출 하고 View 층 을 수 동적 인 것 으로 만 듭 니 다. Presenter 는 View 층 과 Model 층 의 상호작용 을 완성 합 니 다. View 는 Model 과 직접 상호작용 할 수 없습니다 (MVC 에서 Model 과 View 의 상호작용 을 허용 합 니 다). Presenter 가 업 데 이 트 를 알려 야 업 데 이 트 를 할 수 있 습 니 다. 또한 Presenter 와 View 의 상호작용 은 인 터 페 이 스 를 통 해 이 루어 집 니 다.
MVVM:
MVVM 은 Android 에서 data binding 에 대응 합 니 다. MVVM 은 WPF 에서 가장 먼저 사용 되 었 습 니 다. ViewModel 과 View 의 매 핑 을 통 해 View 와 Model 의 양 방향 연결 을 완 성 했 습 니 다. View 의 이 벤트 는 ViewModel 에 직접 전달 되 었 고 ViewModel 은 Model 을 조작 하고 업 데 이 트 를 받 았 습 니 다. 더 나 아가 View 에 피드백 되 었 습 니 다. ViewModel 과 View 의 결합 으로 인해 MVVM 은 View 의 재 활용 문제 가 있 습 니 다. Presenter 를 없 앴 기 때 문 입 니 다.View 층 은 여전히 과중 합 니 다.
MVPVM:
MVP VM 은 MVP 와 MVVM 의 진화 버 전 으로 ViewModel 과 View 의 결합 을 낮 추 었 습 니 다. View 는 ViewModel 의 관찰자 인터페이스 만 업데이트 해 야 합 니 다. ViewModel 은 Model 을 직접 조작 하지 않 고 Presenter. Presenter 작업 모델 에 맡 기 고 ViewModel 에 모델, View, ViewModel 간 에 Presenter 를 통 해 연결 되 었 습 니 다.
MVP 실천
Google 공식 android - architecture 는 MVP 학습 에 가장 좋 은 자료 임 에 틀림없다. 공식 프로젝트 는 서로 다른 방식 으로 MVP 를 실현 하 는 것 을 보 여 주 었 다. 그 중에서 Basic, loaders, data binding, clean, dagger, content provider, rxjava 등 서로 다른 방식 으로 똑 같은 기능 을 실현 하 는 것 을 보 여 주 었 다. 물론 우 리 는 그 정 수 를 파악 하기 만 하면 유추 할 수 있다.
공식 MVP 소감 보기
  • 단독 모듈 추출 IContract 인터페이스 관리 IViewPresenter 인 터 페 이 스 를 한눈 에 알 수 있 고 유지 보수 도 편리 하 다.
    public interface AddEditTaskContract {
    
    interface View extends BaseView<Presenter> {
    //...
    }
    
    interface Presenter extends BasePresenter {
    //...
    }
    }

  • Fragment 가 View 일 때 Activity 는 IViewPresenter 인 스 턴 스 를 만 들 고 이들 을 연결 시 키 는 것 을 책임 집 니 다. 공식 적 인 이 그림 은 설명 할 수 있 습 니 다
  • 코드 설명:
    //todo-mvp$TasksActivity
    @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.tasks_act);
           // ...
           TasksFragment tasksFragment =
                   (TasksFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
           //...
           mTasksPresenter = new TasksPresenter(
                   Injection.provideTasksRepository(getApplicationContext()), tasksFragment);
           //...
       }
  • IPresenter 는 구체 적 인 Presenter 에 의 해 이 루어 지고 IView 는 View 층 Activity/Fragment 에 의 해 이 루어 진다. IView 실현 유형 에는 Presenter 이 포함 되 어 있 는데 그들 은 다음 과 같은 방식 으로 연결 을 실현 한다.
    public interface BaseView<T> {
      // View    Presenter   。
      void setPresenter(T presenter);
    }

  • 동시에 Presenter 구조 시 전송 IView 대상 (업데이트 View 이 필요 합 니 다.
  • public class TasksPresenter implements TasksContract.Presenter {
        private final TasksRepository mTasksRepository;
        private final TasksContract.View mTasksView;
    //...
        public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
            mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
            mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");
    //setPresenter
            mTasksView.setPresenter(this);
        }
  • Model JavaBean 뿐만 아니 라 조작 데이터 의 업무 논리 (획득, 저장, 업데이트) 도 가지 고 있 으 며 Model 업 무 를 인터페이스 로 추출 하여 데이터 소스
  • 를 마음대로 확대 할 수 있다.
    MVP 변종
    MVP 구조의 장점 은 더 이상 말 하지 않 지만 Activity/FragmentView 층 으로 사용 하 는 데 다음 과 같은 문제 가 있 습 니 다. 안 드 로 이 드 에서 MVP 모델 을 실현 하 는 새로운 방향 을 참고 하 십시오.
  • 메모리 가 부족 하고 Activity 가 회수 되면 상태의 저장 과 복구 가 문제 가 됩 니 다. Model 작업 과 관련 되 기 때 문 입 니 다.
  • 생명주기 의 통제 문제 도 매우 번 거 로 우 므 로 Presenter 에 생명주기 와 관련 된 인터페이스 규범 을 많이 써 야 한다
  • Activity 에는 많은 시스템 서비스 가 포함 되 어 있 고 논리 적 조작 이 편리 하 다
  • Presenter 로 Activity / Fragment 사용 하기Activity/Fragment 중의 시스템 서 비 스 는 업무 논리 와 밀접 한 관 계 를 가진다. 이상 적 인 상 태 는 View 가 논리 적 조작 과 관련 되 지 않 는 다 는 것 이다.Activity/Fragment Presenter 로 서 UI 논 리 를 하나의 단독 클래스 에 추출 하여 관리 해 야 합 니 다.
    UI 논리 인터페이스
    public interface Vu {
        void inflate(LayoutInflater inflater, ViewGroup container, Bundle bundle);
        View getView();
    }

    Presenter 의 BaseActivity 로 서 모든 라 이 프 사이클 방법 을 덮어 씁 니 다.
    public abstract class BasePresenterActivity<V extends Vu> extends Activity {
    
        protected V vu;
    
        @Override
        protected final void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            try {
                vu = getVuClass().newInstance();
                vu.inflate(getLayoutInflater(), null,null);
                setContentView(vu.getView());
                onBindVu();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected final void onDestroy() {
            onDestroyVu();
            vu = null;
            super.onDestroy();
        }
    
        protected abstract Class<V> getVuClass();
    
        protected void onBindVu(){};
    
        protected void onDestroyVu() {};
    
    }

    예 를 들 어:
    구체 적 인 UI 논 리 는 Presenter 가 Activity 로 바 뀌 든 Fragment 로 바 뀌 든 바 꾸 지 않 아 도 됩 니 다. 주기 적 인 방법 에서 View 대외 적 인 조작 을 바 꾸 면 됩 니 다.
    public class HelloVu implements Vu {
    
    View view;
    TextView helloView;
    
    @Override
    public void init(LayoutInflater inflater, ViewGroup container) {
        view = inflater.inflate(R.layout.hello, container, false);
        helloView = (TextView) view.findViewById(R.id.hello);
    }
    
    @Override
    public View getView() {
        return view;
    }
    
    public void setHelloMessage(String msg){
        helloView.setText(msg);
    }
    
    }

    구체 적 인 발표 자
    public class HelloActivity extends BasePresenterActivity {
    @Override
    protected void onBindVu() {
        vu.setHelloMessage("Hello World!");
    }
    
    @Override
    protected Class<MainVu> getVuClass() {
        return HelloVu.class;
    }
    
    }

    MVVM: 데이터 의 동적 바 인 딩
    공식 문서:https://developer.android.com/topic/libraries/data-binding/index.html Data Binding 을 사용 하면 xml 은 이전 과 다 릅 니 다. 공식 문 서 를 베 끼 십시오.
    <layout xmlns:android="http://schemas.android.com/apk/res/android">
        <data>
            <variable name="user" type="com.example.User"/>
        </data>
        <LinearLayout>
        ....
        </LinearLayout>
    </layout>

    그 에 상응하는 Activity 의 set ContentView 도 달라 집 니 다.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
       User user = new User("Test", "User");
       binding.setUser(user);
    }

    이 자바 빈 은 xml 레이아웃 파일 에 대응 하여 View 의 재 활용 이 어렵 습 니 다.
    TheMVP: MVVM 과 MVP 의 결합
    TheMVP 는 이 문 제 를 해결 하고 Presenter 에서 ViewModel 인 터 페 이 스 를 정의 함으로써 데이터 의 양 방향 연결 과 MVP 의 결합 을 실현 합 니 다. 프로젝트 주소: kymjs / TheMVP
    핵심 코드: 이곳 의 IDelegate 는 위의 Vu 와 비슷 합 니 다.
    //ViewModel  
    public interface DataBinder<T extends IDelegate, D extends IModel> {
        /**
     *     View  ,          ,             View      ,       ui
     *         ,      。
     *
     * @param viewDelegate      
     * @param data        
     */
        void viewBindModel(T viewDelegate, D data);
    }

    Presenter: 데이터 가 바 뀔 때 notifyModelChanged () 를 호출 하여 View 를 업데이트 합 니 다.
    public abstract class DataBindActivity<T extends IDelegate> extends
            ActivityPresenter<T> {
        protected DataBinder binder;
    
        public abstract DataBinder getDataBinder();
    
        public <D extends IModel> void notifyModelChanged(D data) {
            binder.viewBindModel(viewDelegate, data);
        }
    }

    MVP VM: View 재 활용 및 다이어트
    MVP VM 작성 자 소개 에서...
  • Model 층 은 MVP 의 Model 과 유사 합 니 다. 즉, PO 또는 DO
  • 입 니 다.
  • View 층 은 Activity / Fragment 에 의 해 담당 되 고 서로 다른 것 은 ViewModel 의 관찰자 인 터 페 이 스 를 실현 하여 View 의 동적 업 데 이 트 를 실현 해 야 한 다 는 것 이다
  • .
  • Presenter 층 은 위의 그림 에서 보 듯 이 Presenter 를 핵심 으로 하고 M, V, VM
  • 을 연결한다.
  • VM 계층 은 MVVM 의 VM 과 유사 합 니 다. VM 을 다시 사용 할 수 있 도록 하기 위해 서 입 니 다. 특정한 View 와 연결 되 지 않 고 Model 을 직접 조작 하지 않 습 니 다.
  • 자세 한 내용: 제로 부터 시 작 된 Android 새 프로젝트 3 - MVP in Action, MVP 와 MVVM 이 서로 배척 하 는 것 을 누가 알려 줍 니까?
    참고: android 에서 MVP 모드 를 실현 하 는 새로운 사고방식 ANDROID MVP 모드 의 간단 하고 알 기 쉬 운 소개 방식 MVVMAndroid - Clean Architecture 제로 부터 시 작 된 Android 새 프로젝트 3 - MVP in Action, MVP 와 MVVM 이 서로 배척 하 는 MVP 구조 로 안 드 로 이 드 애플 리 케 이 션 개발

    좋은 웹페이지 즐겨찾기