一、什麼是MVP MVP:全稱 Model View Presenter。 MVP框架由3部分組成:View層負責顯示,Presenter層負責邏輯處理,Model層提供數據。 View:負責繪製UI元素、與用戶進行交互(在Android中體現為Activity,Fragment) Model:負責 ...
一、什麼是MVP
MVP:全稱 Model-View-Presenter。
MVP框架由3部分組成:View層負責顯示,Presenter層負責邏輯處理,Model層提供數據。
View:負責繪製UI元素、與用戶進行交互(在Android中體現為Activity,Fragment)
Model:負責存儲、檢索、操縱數據
Presenter:作為View與Model交互的中間紐帶,處理與用戶交互的負責邏輯。
二、創建Model Presenter View三個包
三、代碼編寫
1.View層代碼
view層負責界面操作,如何確定view層裡面有那些操作呢?
拿我這個UserView舉例.
onLogin代表登錄時候要做的事情,比如顯示一個進度dialog
loginSuccess代表登錄成功後要做的事情,做界面跳轉等操作
loginFail表示登錄失敗後得操作,顯示一個Toast等
public interface UserView{
void onLogin();
void loginSuccess(UserBean bean);
void loginFail(Exception e,int code);
}
2.Presenter層代碼
這層主要負責View層和Model層的連接,也有中間人得意思,
View層請求Presenter層,Presenter在請求Model層,Model層處理數據之後通過回調介面傳遞給Presenter層,Presenter在傳遞給View層
在上一張圖
public class UserPresenter implements UserCallback {
private UserView mUserView;
private UserModel mModel;
public UserPresenter(UserView baseView) {
mUserView = baseView;
mModel= new UserModel(this);
}
public void userLogin(String name, String pass){
mUserView.onLogin();
mModel.userLogin(name,pass);
}
@Override
public void onSuccess(UserBean bean) {
mUserView.loginSuccess(bean);
}
@Override
public void onFail(Exception e, int code) {
mUserView.loginFail(e,code);
}
}
public interface UserCallback {
void onSuccess(UserBean bean);
void onFail(Exception e ,int code);
}
3.model層代碼
model層進行網路請求等耗時任務處理,model會留有一個回調地址,當數據處理完成之後回調它,在本實例中UserCallback就是一個回調介面,具體實現類在Presenter層,也就是說數據處理完成之後會傳遞給Presenter層
public class UserModel {
private UserCallback mUserCallback;
private Map<String,String> mUserMaps;
private Handler mHandler;
/**
*
* @param userCallback 回調地址,當數據處理完成之後調用這個介面
*/
public UserModel(UserCallback userCallback) {
mUserCallback = userCallback;
mUserMaps=new HashMap<>();
mHandler =new Handler(Looper.getMainLooper());
mUserMaps.put("user1","123456");
mUserMaps.put("user2","12345");
mUserMaps.put("user3","1234");
}
public void userLogin(final String name, final String pass){
/**
* 模擬延時操作,2秒後調用UserCallback介面,回傳數據
*/
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mUserMaps.containsKey(name) && mUserMaps.get(name).equals(pass)){
UserBean bean =new UserBean(name,pass,20);
mUserCallback.onSuccess(bean);
}else {
Exception exception =new Exception("用戶名或賬號錯誤");
mUserCallback.onFail(exception,400);
}
}
},2000);
}
}
4.MainActivity
public class MainActivity extends AppCompatActivity implements UserView ,View.OnClickListener {
private ProgressDialog mProgressDialog;
private EditText mUserText;
private EditText mUserPass;
private Button mLoginBtn;
private UserPresenter mUserPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUserPresenter=new UserPresenter(this);
initView();
initEvents();
}
private void initEvents() {
mLoginBtn.setOnClickListener(this);
}
public void initView () {
mUserText = (EditText) findViewById(R.id.userName);
mUserPass = (EditText) findViewById(R.id.userPass);
mLoginBtn = (Button) findViewById(R.id.loginBtn);
}
@Override
public void onLogin() {
mProgressDialog =new ProgressDialog(this);
mProgressDialog.show();
}
@Override
public void loginSuccess(UserBean bean) {
Toast.makeText(this, "登錄成功,年齡"+bean.getAge(), Toast.LENGTH_SHORT).show();
}
@Override
public void loginFail(Exception e, int code) {
if (mProgressDialog!=null){
mProgressDialog.dismiss();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.loginBtn:
if (getUserPass().length()==0 || getUserText().length()==0){
Toast.makeText(this, "請輸入賬號或密碼", Toast.LENGTH_SHORT).show();
return;
}
mUserPresenter.userLogin(getUserText(),getUserPass());
break;
}
}
private String getUserText(){
return mUserText.getText().toString();
}
private String getUserPass(){
return mUserPass.getText().toString();
}
}
5.XML佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:background="#ffffff"
tools:context=".MainActivity">
<LinearLayout
android:layout_margin="15dp"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:textColor="#616161"
android:id="@+id/userName"
android:inputType="text"
android:background="@drawable/shape_editview"
android:layout_width="match_parent"
android:layout_height="55dp" />
<EditText
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:textColor="#616161"
android:layout_marginTop="8dp"
android:id="@+id/userPass"
android:inputType="textPassword"
android:background="@drawable/shape_editview"
android:layout_width="match_parent"
android:layout_height="55dp" />
<Button
android:layout_marginTop="8dp"
android:textColor="#ffffff"
android:textSize="19sp"
android:background="@drawable/shape_login_btn"
android:text="登錄"
android:id="@+id/loginBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
6.兩個shape
shape_editview.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="30dp"></corners>
<solid android:color="#f7f5f5"></solid>
</shape>
shape_login_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<corners android:radius="100dp"></corners>
<solid android:color="#03a9f4"></solid>
</shape>
</item>
<item android:state_pressed="false">
<shape>
<corners android:radius="100dp"></corners>
<solid android:color="#0a9ddf"></solid>
</shape>
</item>
</selector>
以上就是MVP模式得簡單實現.一定要多加練習,才能體會掉MVP得優點