概述
之前看到鸿洋大神写的登录的mvp模式,感觉懂了什么是MVP,但是自己写又写不出来,最近又翻出来从新学习了一下,在这边记录一下。
对于MVP (Model View Presenter),大多数人都能说出一二:“MVC的演化版本”,”让Model和View完全解耦” 等等。
我还真是抱着这样一个疑问
为何这个模式出来后,就能被广大的Android的程序员接受呢?
直到我开始自己去构建程序,自己去搭建架构,才发现我每次去改View,牵一发而动全身,极不方便,所以才下定决心,一定要好好的学习一下MVP架构,最近看到了个更好理解的MVP架构。好好学习一下。
废话不多说。
首先构建一个简单的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.mvpexample.MainActivity">
<EditText
android:id="@+id/edit_query"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btn_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Submit" />
<TextView
android:id="@+id/txt_result"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
布局就是这么简单。一个Button 。一个 EditText 。一个textView。
我希望点击Button后由Presenter通知Model层进行操作,最后Model层返回给数据Presenter.Presenter再通知给View层,整个流程都是通过接口进行通信,我们点击方法的时候也只能进到接口中,也保护了我们的方法不被意外修改。
首先定义一个Presenter接口,大致是这样
public interface IPresenter {
void search();
}
再定义一个View的接口
public interface IView {
String getInputString();
void setResultString(String string);
}
model层的接口
public interface IUserService {
String search(int hashCode);
}
Model的实现类返回我们需要的数据
public class UserService implements IUserService {
@Override
public String search(int hashCode) {
return "User:" + hashCode;
}
}
View的实现类就用Activity
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.TextView;
public class MainActivity extends AppCompatActivity implements IView{
TextView mResultText;
EditText mInputText;
Button mSubmit;
private IPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultText = (TextView) findViewById(R.id.txt_result);
mInputText = (EditText) findViewById(R.id.edit_query);
mSubmit = (Button) findViewById(R.id.btn_submit);
mPresenter = new Presenter(this);
mSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPresenter.search();
}
});
}
@Override
public String getInputString() {
return mInputText.getText().toString();
}
@Override
public void setResultString(String string) {
mResultText.setText(string);
}
}
Presenter实现联通Model和View的功能
import android.text.TextUtils;
/**
* @author
* @version 1.0.0
*/
public class Presenter implements IPresenter {
private IView mView;
public Presenter(IView view){
mView = view;
}
@Override
public void search() {
//开启界面Loading
String inputString = mView.getInputString();
if(TextUtils.isEmpty(inputString)){
//为空直接返回
return;
}
int hashCode = inputString.hashCode();
IUserService service = new UserService();
String result = "Result:"+ inputString+ "-" +service.search(hashCode);
//关闭界面Loading
mView.setResultString(result);
}
}