一、MVP简介
MVP由Model、View、Presenter构成。
M(Model) 数据相关层
V(View) 视图层,如Activity上的布局
P(Presenter) 纽带层,用来连接Model与View.
- View层定义View.interface,用来定义View的行为。一般由Activity或者是Fragment来实现这个接口,它定义了View视图的各种变化,如设置Textview,加载对话框,更新进度条等。
- Model层定义Modle.interface,这个是用来定义数据层发生变化时的通知接口,因为Model不能直接与View交互,所以它与Presenter交互,然后再通过Presenter间接达到与View的交互。
- Presenter翻译的意思是主持人,也就是主持场合,控制节奏的意思。在这时Presenter就负责具体的业务逻辑,请求数据,把数据送到Model,或者监听Model的数据变化,接受View层的动作,负责通过通知View层的视图变化。
二、MVP实战
1.需求分析
假设现在需要做一款APP,就是显示天气,界面很简单,一个TextView显示天气信息,一个Button用来请求实时天气。
如下图所示
实例.png
用户点击获取实时天气的按钮,界面上会弹出正在获取中的进度对话框,等待数据加载成功后,对话框消失。Textview显示就新的天气情况。
2.功能开发
1.代码整体结构
2.View层的接口定义及实现
在MVP中Activity用来专注视图的表现。
View的表现当然要用View.interface接口来定义 ,定义了接口之后再MainActivity中去实现这些方法
View.interface如下:
public interface IWetherView {
//显示天气信息
public void onInfoUpdate(String info);
//显示获取信息等待对话框
public void showWaitingDialog();
//取消显示对话框
public void dissmissWaitingDialog();
}
3.Model层的接口定义及实现
Model层是数据层,用来存储数据并且提供数据。定义一个接口和实现这个接口的类就可以了。
接口定义如下:
public interface IWetherModel {
//提供数据
public String getInfo();
//存储数据
public void setInfo(String info);
}
它的实现文件如下:
public class IWetherModelImpl implements IWetherModel {
@Override
public String getInfo() {
return null;
}
@Override
public void setInfo(String info) {
}
}
4.Presenter代码及实现
Presenter就是一个中介,负责调用view和model里面的方法
完整的Presenter代码如下:
public class WetherPresenter {
IWetherModelImpl mModel;
IWetherView mView;
public WetherPresenter(IWetherView mView) {
this.mView = mView;
mModel = new IWetherModelImpl();
}
public void requestWetherInfo(){
getNetworkInfo();;
}
private void showWaitingDialog(){
if (mView != null) {
mView.showWaitingDialog();
}
}
private void dissmissWaitingDialog(){
if (mView != null) {
mView.dissmissWaitingDialog();
}
}
private void updateWetherInfo(String info){
if (mView != null) {
mView.onInfoUpdate(info);
}
}
private void saveInfo(String info){
mModel.setInfo(info);
}
private String localInfo(){
return mModel.getInfo();
}
private void getNetworkInfo(){
new Thread(new Runnable() {
@Override
public void run() {
try {
//打开等待对话框
showWaitingDialog();
//模拟网络耗时
Thread.sleep(6000);
String info = "21度,晴转多云";
//保存到Model层
saveInfo(info);
//从Model层获取数据,为了演示效果,实际开发中根据情况需要。
String localinfo = localInfo();
//通知View层改变视图
updateWetherInfo(localinfo);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//取消对话框
dissmissWaitingDialog();
}
}
}).start();
}
}
5.MainActivity代码编写
其实MainActivity就是实现view的接口,里面的什么关于显示对话框、加载文本那些view的操作都是在这里实现的。整个MainActivity.java代码如下:
public class MainActivity extends AppCompatActivity implements IWetherView{
private static final String TAG = "MainActivity";
WetherPresenter mPresenter;
private TextView mTvInfo;
private Button mButton;
private ProgressDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPresenter = new WetherPresenter(this);
mTvInfo = (TextView) findViewById(R.id.tv_info);
mButton = (Button) findViewById(R.id.btn_request);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPresenter.requestWetherInfo();
}
});
}
@Override
public void onInfoUpdate(final String info) {
Log.d(TAG, "onInfoUpdate: "+info);
runOnUiThread(new Runnable() {
@Override
public void run() {
mTvInfo.setText(info);
}
});
}
@Override
public void showWaitingDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mDialog != null && mDialog.isShowing()){
mDialog.dismiss();
}
mDialog = ProgressDialog.show(MainActivity.this,"","正在获取中...");
}
});
}
@Override
public void dissmissWaitingDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mDialog != null && mDialog.isShowing()){
mDialog.dismiss();
}
}
});
}
}
网友评论