今天估计是这学期最后一天花这么多时间在Android上了,因为接下来的一段时间里,我将会不断的考试不断的做实验不断的课程设计,而偏偏我是个学粉。。学渣已经形容不了我了,现在的状态真的是渣都不剩了。不过还好还好有自己喜欢的事,有事没事可以看看书看看博客撩撩妹。今天写一下关于MVP架构的,我尽量将我这个初学者思考过程说清楚。不扯淡先看看今天的demo的预览图。
开波
本来我也想先给大家说说什么是MVC然后MVP怎样来的,然后摔出一大堆官方的文档,接着说自己的感受。但是这些基本那些介绍MVP的博文都会说到,我就不说了,因为MVC的话,个人觉得你在写大一点的Demo时自然而然的就会抽取提炼,那大概就是MVC了吧?大差不差。那么什么是MVP呢?下面po图(第一次画图我知道丑不过先将就着吧):
上面的图其实已经说清楚了什么是MVP
- View层仅负责加载视图(Activity or Fragment)与用户交互(键盘输入),不处理业务逻辑。
- Model层负责处理业务。
-
Presenter层负责控制两者之间的交往?(用这个次准确吗),因此Presenter必须揣有View和Model的实例。
要点就这三点,下面在代码中说明吧。
中场
看代码总是最轻松的,下图即为demo的java文件。
我先介绍一下各部分的作用:
-
config因为此次顺带复习了一溜
Retorfit
,所以CallService是Retrofit
的接口,Config则是我在聚合数据拿的一个新闻APi。在此谢谢阿里妈妈和马云爹爹。 - model是业务层,里面有NewInfo这个接收解析后Json数据的实体bean,NewLogic则是业务逻辑处理类,INewCallBack是一个监听网络请求后的回调。
- presenter是用以给model和view交互的中间人
- view里面有一个定义给MainActivity使用的接口ViewLogic,通过此接口我们可以给界面添加交互所需的方法。同时因为交互需要来自model的数据,但是并不能直接拿到所以可以拿到Presenter实例间接获取数据。当然由图可知通过此接口我们可以在Presenter拿到View的实例。
下面看代码:
model层
- NewLogic.java
/* 业务逻辑:分析可知功能仅仅为申请新闻数据*/
public class NewsLogic {
private CallService callService;
public NewsLogic() {
Retrofit mRetrofit = new Retrofit.Builder().baseUrl(Config.BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).build();
callService = mRetrofit.create(CallService.class);
}
public void getNew(Map<String,String> map, final INewCallBack callBack){
Call<NewInfo> call = callService.getNewInfo(map);
call.enqueue(new Callback<NewInfo>() {
@Override
public void onResponse(Call<NewInfo> call, Response<NewInfo> response) {
if (response.isSuccessful()){
callBack.onSucceed(response);
}else{
callBack.onFailure("获取新闻信息失败");
}
}
@Override
public void onFailure(Call<NewInfo> call, Throwable t) {
callBack.onFailure("获取新闻信息失败");
}
});
}
}```
* **NewInfo**这个类是通过**GsonFormat**解析的太长所以在这里不放了。
**View层**
**ViewLogic.java**
public interface ViewLogic {
//显示加载bar
void showProgress();
//隐藏加载bar
void hideProgress();
//显示新闻内容
void showInfo(NewInfo newInfo);
//获取失败时操作
void showError(String 获取新闻信息失败);
}```
MainActivity.java
public class MainActivity extends AppCompatActivity implements ViewLogic {
//一些声明
private Button mButton;
private Presenter mPresenter = new Presenter(this);/*获取Presenter实例间接货物model数据*/
private ProgressBar mProgress;
private TextView mTitle,mTime;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();/*初始化控件*/
}
private void init() {
mTitle = (TextView) findViewById(R.id.title);
mTime = (TextView) findViewById(R.id.time);
img = (ImageView) findViewById(R.id.img);
mProgress = (ProgressBar) findViewById(R.id.progress);
mButton = (Button) findViewById(R.id.btn_get);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.getInfo();/*获取新闻数据*/
}
});
}
@Override
public void showProgress() {
mProgress.setVisibility(View.VISIBLE);/*显示加载条*/
}
@Override
public void hideProgress() {
mProgress.setVisibility(View.GONE);/*隐藏加载条*/
}
/***
* 显示新闻数据
* @param newInfo
*/
@Override
public void showInfo(NewInfo newInfo) {
mTitle.setText(newInfo.getResult().getData().get(0).getTitle());
mTime.setText(newInfo.getResult().getData().get(0).getDate());
Picasso.with(this).load(newInfo.getResult().getData().get(0).getThumbnail_pic_s()).into(img);
}
/**
* 获取出错时
* @param 获取新闻信息失败
*/
@Override
public void showError(String 获取新闻信息失败) {
Toast.makeText(this, "获取新闻信息失败", Toast.LENGTH_SHORT).show();
}
}```
* Activity仅仅用以加载视图和与用户交互没有过多的业务逻辑处理。
**Presenter层**
**Presenter.java**
public class Presenter {
//y必须拥有molde层和view层实例
private NewsLogic mNewsLogic;
private ViewLogic mViewLogic;
public Presenter(ViewLogic viewLogic) {
mViewLogic = viewLogic;
mNewsLogic = new NewsLogic();
}
//功能只有获取数据
public void getInfo(){
mViewLogic.showProgress();
HashMap<String, String> map = new HashMap<>();
map.put("type","tiyu");
map.put("key", Config.KEY);
mNewsLogic.getNew(map, new INewCallBack() {
@Override
public void onSucceed(Response<NewInfo> response) {
NewInfo newInfo = response.body();
mViewLogic.hideProgress();
mViewLogic.showInfo(newInfo);
}
@Override
public void onFailure(String 获取新闻信息失败) {
mViewLogic.hideProgress();
mViewLogic.showError(获取新闻信息失败);
}
});
}
}```
下半场
其实也可以通过一个不太恰当的例子来阐述什么是MVP,我们可以把View看作现流行的网红女主播,在MVC的时代,咱们的主播除了展示自己美好的身材以外,还需要不断的说“喜欢主播的宝宝可以点亮,送的礼物越多主播的浮力越大哦”(此看作逻辑处理),这样就会造成咱们的女主播一边喊一边应付浮力多辛苦,但是在MVP的时代,以上逻辑交给了中间人Presenter,也就是场馆在不断的发弹幕处理之前需要主播处理的业务逻辑,而咱们的女主播呢,就可以专心的表演了仅仅充当加载视图的功能。如果大家不相信,可以下载个直播软件试试哈(我是不是暴露了什么哈哈哈。。。),这个例子不知道准不准确,但是以我初学者的眼神大差不差。今天的笔记就写到这里了,不知道是否说得明白,大家也在github上下载我的demo来看看。我的github地址。