在说mvp之前,先说下mvc:
MVC( Model View Controller):一种将逻辑和视图分隔开来的架构设计,起源于web端。其实 Android应用的开发中本身可视为一种MVC架构。
- M–>Model: 数据模型(bean文件)、 业务逻辑
- V–> View:可见的界面(android的xml布局文件)
- C–>Controller:控制view和model的交互(android的 Activity)
说是这样,其实在实际开发中,大家仔细想想,Activity是不是很尴尬。。。( Activity既要负责视图的显示,又要负责对业务逻辑的处理)
好了重点来了:注意前方高能!!!
用法:
Model
这个东东,我看了好多mvp的案例,好像model层和其他两层分界不是很明显一样,写的可有可无似的,还有案列说这层可以写一些比如访问数据库、访问网络的方法等,好吧,我的案例就是写的请求服务器的。View:这个view就是要把与用户交互的效果展示出来,我们要把这些方法抽取出来,然后让activity或者fragment去实现这些方法(当然有些重复的方法我们最好抽取到基类里面)。
Presenter:在这里我们需要获取view和model的引用,从而完成view和model的交互。
看到这里是不是有点懵逼。。。
下面看案例:
为了清晰,我写了最少的代码来讲我理解的mvp:
先上图压压惊:
没错,这是项目文件:
BaseView.java:
一共2个方法,注释很清晰,当然我们的view(activity)要实现这个接口
package app.project.mvp.view;
/**
* Created by QLY on 2016/8/31.
*
* UI逻辑接口,一般有activity、Fragment实现
*/
public interface BaseView {
/**
* 显示加载进度
*/
void loading();
/**
* 隐藏加载进度
*/
void cancelLoading();
}
BaseNet.java:
定义一个请求服务器的方法
package app.project.mvp.model;
/**
* Created by QLY on 2016/9/1.
*/
public interface BaseNet {
/**
* 请求服务器
*/
void RequestService();
}
BaseNetIml.java:
实现类
package app.project.mvp.model;
import android.util.Log;
/**
* Created by QLY on 2016/9/1.
*/
public class BaseNetIml implements BaseNet{
@Override
public void RequestService() {
Log.i("test", "RequestService: 请求服务器。。。");
}
}
BasePresenter .java:
package app.project.mvp.presenter;
/**
* Created by QLY on 2016/9/1.
* 页面业务逻辑(一般都要参与服务器交互)
*/
public interface BasePresenter {
/**
* 数据加载结果
*/
void loadResult();
}
PresenterIml.java
负责拿到BaseView 、BaseNet的引用,从而实现交互
package app.project.mvp.presenter;
import android.util.Log;
import app.project.mvp.model.BaseNet;
import app.project.mvp.model.BaseNetIml;
import app.project.mvp.view.BaseView;
/**
* Created by QLY on 2016/9/1.
*/
public class PresenterIml implements BasePresenter {
private BaseView mvpView;
private BaseNet baseNet;
public PresenterIml(BaseView mvpView) {
this.mvpView = mvpView;
baseNet = new BaseNetIml();
}
/**
* 加载数据
*/
public void loadData() {
mvpView.loading();
baseNet.RequestService();
}
@Override
public void loadResult() {
Log.i("test", "loadResult: 服务器返回结果。。。");
mvpView.cancelLoading();
}
}
接下来就是activity了:
package app.project.mvp.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.Random;
import app.project.R;
import app.project.mvp.presenter.BasePresenter;
import app.project.mvp.presenter.PresenterIml;
public class TestActivity extends AppCompatActivity implements BaseView {
private PresenterIml mPresenter;
boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
mPresenter = new PresenterIml(this);
//开始请求服务器
mPresenter.loadData();
//加载完成
mPresenter.loadResult();
}
@Override
public void loading() {
Log.i("test", "loading: 开始加载。。。");
}
@Override
public void cancelLoading() {
Log.i("test", "loading 加载完成。。。");
}
}
看 log:
差点忘了大招没放。。。:
下图是github的一张图,比较靠谱,大家不要看左面,看右面,你们是不是发现activity、fragment里包裹了
view、presenter这就说activity要拿到二者的引用来实现model和view的交互,其实左面就是model层。
不要问我bean文件为什么不用,因为我只是像说明mvp的基本用法,bean太low没个卵用。。。