Android 의 MVP 구조 분해 와 실현 에 대해 자세히 알 아 보기
전통 적 인 안 드 로 이 드 개발 구 조 는 일반적으로 MVC 모델 이다.
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 층 인터페이스 정의 에 대해 먼저 기능 적 인 조작 을 고려 한 다음 에 고려 합 니 다.
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 를 결합 하여 개발 하여 논리 가 더욱 뚜렷 해 졌 으 며,다음 글 은 이 부분 을 상세 하 게 소개 할 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.