Android 의 MVP 구조 분해 와 실현 에 대해 자세히 알 아 보기

10361 단어 androidmvp
1.개술
전통 적 인 안 드 로 이 드 개발 구 조 는 일반적으로 MVC 모델 이다.
  • 모델:업무 논리 와 실체 모델
  • View:레이아웃 파일
  • 에 대응 합 니 다.
  • Controller:Activity 에 대응
  • 단독으로 논리 적 으로 보면 매우 좋 습 니 다.저희 가 웹 개발 을 할 때 개발 모델 과 유사 하지만 실제 개발 에서 View 는 레이아웃 파일 에 대응 합 니 다.실제 이 레이아웃 파일 에 있 는 데이터 바 인 딩 작업 에 대해 사건 처리 코드 는 모두 Activity 에 있 습 니 다.Activity 는 View 와 Controller(MVVP 구조 에 데이터 바 인 딩 포함)와 같 아서 Activity 에서 직무 책임 이 너무 큽 니 다.결합 도가 크다.수정 과 유지 보수 가 매우 번거롭다.
    这里写图片描述
    2、MVP 소개
    这里写图片描述
    MVP 구조 에서 View 는 Activity 에 대응 하고 View 의 그리 기 및 사용자 와 의 상호작용 을 책임 집 니 다.
    모델 은 여전히 업무 논리 와 실체 모델 로 Presenter 는 View 가 모델 간 의 상호작용 을 완성 하 는 것 을 책임 진다.
    (1)Model 층
    모델 층 에서 하 는 일 은 구체 적 인 업무 논리 처리 의 실현 으로 프로그램 에서 각종 데이터 의 처리 와 수반 되 고 복잡 한 것 은 하나의 인터페이스 로 결합 해 야 한다.
    (2)뷰 층
    보기 층 은 매우 얇 게 나타 나 고 데 이 터 를 표시 하 며 우호 적 인 인터페이스 를 제공 하여 사용자 와 상호작용 을 하면 됩 니 다.MVP 에서 Activity 와 Fragment 는 이 층 에 나타난다.Activity 는 보통 UI 보 기 를 불 러 오고 감청 을 설정 한 다음 에 Presenter 가 처리 하 는 작업 을 하기 때문에 해당 Presenter 의 인용 을 가 져 야 한다.기본 UI 논 리 를 처리 하여 비어 있 는 지 여 부 를 판단 합 니 다.
    (3)Presenter 층
    Presenter 라 는 층 은 프로그램의 각종 논리 적 분 배 를 처리 하고 View 층 UI 의 피드백 명령,정시 명령,시스템 명령 등 명령 을 받 은 후에 배포 처리 논 리 는 Model 층 에 의 해 구체 적 인 업무 작업 을 하도록 한다.
    MVP 구조 와 MVC 구조 차이:
    这里写图片描述
    MVC 에 서 는 Model 과 View 의 상호작용 을 허용 하고 MVP 에 서 는 Model 과 View 간 의 상호작용 이 Presenter 에 의 해 이 루어 집 니 다.또 하 나 는 Presenter 와 View 간 의 상호작용 이 인 터 페 이 스 를 통 해 이 루어 진 다 는 것 이다.
    3.MVP 실현
    백 번 말 하 는 것 보다 한 번 하 는 것 이 낫다.간단 한 로그 인 작업 을 실현 합 니 다.
    프로젝트 구 조 는 다음 과 같다.
    这里写图片描述
    (1)Model 층 실현
    먼저 User 실체 클래스 구현:
    
    package com.chunsoft.blogcontent.bean;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:19
     * Content:   
     */
    
    public class User {
    
     private String username;
     private String password;
    
     public String getUsername() {
      return username;
     }
    
     public void setUsername(String username) {
      this.username = username;
     }
    
     public String getPassword() {
      return password;
     }
    
     public void setPassword(String password) {
      this.password = password;
     }
    }
    
    
    model 층 은 주로 업무 논리 처 리 를 실현 합 니 다.본 사례 에서 주요 논리 처 리 는 로그 인 입 니 다.하나의 인터페이스 와 하나의 실현 류 를 추출 했 습 니 다.login 작업,모 의 로그 인 작업,Thread.sleep()모 의 시간 이 걸 렸 습 니 다.시간 이 걸 리 기 때문에 하나의 리 턴 을 통 해 로그 인 상 태 를 알 립 니 다.
    model 계층 인터페이스:
    
    package com.chunsoft.blogcontent.model;
    
    import com.chunsoft.blogcontent.RequestCallback;
    import com.chunsoft.blogcontent.bean.User;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:30
     * Email:[email protected]
     * Content:Model              
     */
    
    public interface LoginModel {
     void login(String username, String password, RequestCallback<User> callback);
    }
    
    
    model 계층 인터페이스 구현:
    
    package com.chunsoft.blogcontent.model.impl;
    
    import com.chunsoft.blogcontent.RequestCallback;
    import com.chunsoft.blogcontent.bean.User;
    import com.chunsoft.blogcontent.model.LoginModel;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:31
     * Content:Model    
     */
    
    public class LoginModelImpl implements LoginModel{
     @Override
     public void login(final String username, final String password, final RequestCallback<User> callback) {
      //      
      new Thread() {
       @Override
       public void run() {
        try {
         Thread.sleep(2*1000);
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
        if ("chunsoft".equals(username) && "123456".equals(password)) {
         User user = new User();
         user.setUsername(username);
         user.setPassword(password);
         callback.onSuccess(user);
        } else {
         callback.onFailure("    ");
        }
       }
      }.start();
     }
    }
    
    
    리 셋 인터페이스:
    
    package com.chunsoft.blogcontent;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:35
     * Content:    
     */
    
    public interface RequestCallback<T> {
     void onSuccess(T datas);
     void onFailure(String msg);
    }
    
    
    (2)View 층 실현
    View 층 인터페이스 정의 에 대해 먼저 기능 적 인 조작 을 고려 한 다음 에 고려 합 니 다.
  • 이 조작 은 무엇 을 필요 로 합 니까?getUserName 등)
  • 이 조작 결과 에 대응 하 는 피드백 은?(toMainActivity 등)
  • 이 조작 과정 에서 상호작용 이 우호 적 입 니까?(showLoading)
  • view 계층 인터페이스:
    
    package com.chunsoft.blogcontent.view;
    
    import com.chunsoft.blogcontent.bean.User;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:54
     * Email:[email protected]
     * Content:view   
     */
    
    public interface LoginView {
     String getUserName();
     String getPassword();
    
     void showLoading();
     void hideLoading();
    
     void toMainActvity(User user);
     void showFailedError(String msg);
    }
    
    
    view 층 이 실현 되 는 것 은 바로 Activity 입 니 다.Activity 의 코드 량 이 크게 감소 하고 논리 가 뚜렷 한 것 을 볼 수 있 습 니 다.
    
    package com.chunsoft.blogcontent;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    import com.chunsoft.blogcontent.bean.User;
    import com.chunsoft.blogcontent.presenter.impl.LoginPresenterImpl;
    import com.chunsoft.blogcontent.view.LoginView;
    
    public class MainActivity extends AppCompatActivity implements LoginView{
    
     private EditText et_mobile,et_password;
     private ProgressBar pb;
     private Button btn_login;
    
     private LoginPresenterImpl mLoginPresenter = new LoginPresenterImpl(this);
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
      et_mobile = (EditText) findViewById(R.id.et_mobile);
      et_password = (EditText) findViewById(R.id.et_password);
      pb = (ProgressBar) findViewById(R.id.pb);
      btn_login = (Button) findViewById(R.id.btn_login);
    
      btn_login.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
        mLoginPresenter.login();
       }
      });
     }
    
     @Override
     public String getUserName() {
      return et_mobile.getText().toString();
     }
    
     @Override
     public String getPassword() {
      return et_password.getText().toString();
     }
    
     @Override
     public void showLoading() {
      pb.setVisibility(View.VISIBLE);
     }
    
     @Override
     public void hideLoading() {
      pb.setVisibility(View.INVISIBLE);
     }
    
     @Override
     public void toMainActvity(User user) {
      Toast.makeText(this,user.getUsername() + "    ",Toast.LENGTH_SHORT).show();
     }
    
     @Override
     public void showFailedError(String msg) {
      Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
     }
    }
    
    
    (3)Presenter 층 실현
    Presenter 층 은 Model 층 과 View 층 의 교량 으로 본 고 는 하나의 인터페이스 와 하나의 실현 류 를 추상 화 했다.정 의 를 내 릴 때 주로 이 기능 이 어떤 조작 을 하 는 지 볼 수 있다.예 를 들 어 로그 인:
    Presenter 인터페이스:
    
    package com.chunsoft.blogcontent.presenter;
    
    /**
     * Developer:chunsoft on 2017/2/7 11:49
     * Content:Presenter   
     */
    public interface LoginPresenter {
      void login();
    }
    
    Presenter 층 실현:
    
    package com.chunsoft.blogcontent.presenter.impl;
    
    import android.os.Handler;
    
    import com.chunsoft.blogcontent.RequestCallback;
    import com.chunsoft.blogcontent.bean.User;
    import com.chunsoft.blogcontent.model.LoginModel;
    import com.chunsoft.blogcontent.model.impl.LoginModelImpl;
    import com.chunsoft.blogcontent.presenter.LoginPresenter;
    import com.chunsoft.blogcontent.view.LoginView;
    
    
    /**
     * Developer:chunsoft on 2017/2/7 11:50
     * Content:Presenter   
     */
    
    public class LoginPresenterImpl implements LoginPresenter {
    
     private LoginView loginView;
     private LoginModel loginModel;
    
     private Handler mHandler = new Handler();
    
     //         
     public LoginPresenterImpl(LoginView loginView) {
      this.loginModel = new LoginModelImpl();
      this.loginView = loginView;
     }
    
     @Override
     public void login() {
      loginView.showLoading();
      loginModel.login(loginView.getUserName(), loginView.getPassword(), new RequestCallback<User>() {
       @Override
       public void onSuccess(final User datas) {
        //    
        mHandler.post(new Runnable() {
         @Override
         public void run() {
          loginView.toMainActvity(datas);
          loginView.hideLoading();
         }
        });
       }
    
       @Override
       public void onFailure(final String msg) {
        //    
        mHandler.post(new Runnable() {
         @Override
         public void run() {
          loginView.showFailedError(msg);
          loginView.hideLoading();
         }
        });
       }
      });
     }
    }
    
    Presenter 층 은 Model 층 과 View 층 의 교량 으로 Model 층 과 View 층 이 직접 통신 하지 않 기 때문에 Presenter 층 은 Model 층 과 View 층 의 실현 류 가 필요 하 다.View 층 에서 중요 한 파 라 메 터 를 얻어 Model 층 에 업무 논리 처 리 를 호출 하고 실 행 된 결과 와 피드백 을 View 층 에 보 여 준다.
    본문 원본 코드 다운로드
    본 고 는 간단하게 MVP 구조 로 로그 인 작업 을 실현 하고 있 으 며,현재 주류 개발 은 Rxjava,Retrofit,MVP 를 결합 하여 개발 하여 논리 가 더욱 뚜렷 해 졌 으 며,다음 글 은 이 부분 을 상세 하 게 소개 할 것 이다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기