如今项目中采用了MVC和MVP的混合结构,我感受MVP和MVC各有各的有点,MVC更容易入手,写的类也相对较少 ,MVP是至关于MVC的升级版 ,面向接口编程,是view和modle彻底解耦,更利于项目的维护,项目结构更清晰,各自的职责更加清晰 ,但也有缺点就是要写的类更多,但整体来讲MVP架构仍是更好的选择编程
mvc是传统的项目架构,在Android项目中bash
(MVC架构)
复制代码
(流程图 model和view彻底耦合到一块儿)网络
mvp是为了让view和model进行解耦,项目结构更加清晰,解放Activity架构
上图明显的归纳出了mvc和mvp的不一样点,就是mvp是view和modle不直接交互,二者的交互交给presenter来处理,还有一点就是prsenter和view之间的交互是经过接口交互的mvc
我按照mvp的架构写了一个demo,demo是新闻列表的一个item,效果图以下ide
public class NewMessage {
public String title; //标题
public String content; //内容
public boolean colleciton; //收藏
public NewMessage(String title ,String content ,boolean colleciton){
this.title = title;
this.content = content;
this.colleciton = colleciton;
}
}
复制代码
根据页面逻辑,网络处理主要有拉取新闻信息 和点赞和取消赞的操做oop
public interface INetOperation {
/**
* 获取信息信息
* @param netListener
*/
public void getMessage(NetListener netListener);
/**
* 点赞取消赞
* @param collection
* @param netListener
*/
public void collectionOperation(boolean collection,NetListener netListener);
//网络回调
public abstract class NetListener{
public void doMessge(NewMessage newMessage){};
public void collectionSuccess(){};
public void collectionFail(){};
}
}
复制代码
对应的实现类以下布局
public class NetOperation implements INetOperation{
Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
public void getMessage(final NetListener netListener) {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final NewMessage newMessage =new NewMessage("中国雄起","改革开放后中国高速发展,改革开放后中国高速发展,",true);
mainHandler.post(new Runnable() {
@Override
public void run() {
netListener.doMessge(newMessage);
}
});
}
}.start();
}
@Override
public void collectionOperation(boolean collection, final NetListener netListener) {
new Thread(){
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mainHandler.post(new Runnable() {
@Override
public void run() {
netListener.collectionSuccess();
}
});
}
}.start();
}
}
复制代码
view和presenter交互是经过接口进行交互的,咱们定义了一个INewMessageView的一个接口 ,但这个接口具体有什么方法呢,就须要根据具体的业务逻辑进行书写,本demo中页面处理有两处 1:设置新闻相关内容,2:更新收藏状态post
public interface INewMessageView {
/**
* 设置页面新闻信息内容
* @param message
*/
void setContent(NewMessage message);
/**
* 更新收藏信息
* @param collection
*/
void setCollection(boolean collection);
}
复制代码
下面看下具体的实现ui
public class MvpActivity extends AppCompatActivity implements View.OnClickListener , INewMessageView{
public TextView title;
public TextView content;
public ImageView colleciotn;
private MessagePresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
title = findViewById(R.id.title);
content = findViewById(R.id.content);
colleciotn = findViewById(R.id.collection);
colleciotn.setOnClickListener(this);
presenter = new MessagePresenter(this);
presenter.getMessage();
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.collection:
presenter.collection();
break;
}
}
@Override
public void setContent(NewMessage message) {
title.setText(message.title);
colleciotn.setSelected(message.colleciton);
content.setText(message.content);
}
@Override
public void setCollection(boolean collection) {
colleciotn.setSelected(collection);
}
}
复制代码
上面能够看到具体的实现是由Activity实现的
presenter主要用来view和model的交互的,根据本demo它该有什么方法呢 主要有两个方法,1:获取新闻信息 2:点赞取消赞操做
public class MessagePresenter {
private INewMessageView messageView;
//强求回来的数据
private NewMessage message;
private INetOperation netOperation;
public MessagePresenter(INewMessageView iNewMessageView){
this.messageView = iNewMessageView;
netOperation = new NetOperation();
}
/**
*收藏
*/
public void collection(){
if (message ==null){
return;
}
netOperation.collectionOperation(message.colleciton, new INetOperation.NetListener() {
@Override
public void collectionSuccess() {
super.collectionSuccess();
message.colleciton = !message.colleciton;
messageView.setCollection(message.colleciton);
}
@Override
public void collectionFail() {
super.collectionFail();
}
});
}
/**
* 获取新闻信息
*/
public void getMessage(){
netOperation.getMessage(new INetOperation.NetListener() {
@Override
public void doMessge(NewMessage newMessage) {
super.doMessge(newMessage);
message = newMessage;
messageView.setContent(newMessage);
}
});
}
}
复制代码
代码如上,是否是比较清晰
presenter承接了页面的业务逻辑处理,负责view和model的交互,从网络上拉取数据,更新到页面上
到这本片文章就结束了 ,本文参考了鸿洋大神的博客,其中有些图也是从他的博客中拉取的,第一次在掘金上写blog,写文章的脉络还不太熟悉,写的也比较慢,但愿本身愈来愈好吧,加油