Android MVP架构

1.简介

如今项目中采用了MVC和MVP的混合结构,我感受MVP和MVC各有各的有点,MVC更容易入手,写的类也相对较少 ,MVP是至关于MVC的升级版 ,面向接口编程,是view和modle彻底解耦,更利于项目的维护,项目结构更清晰,各自的职责更加清晰 ,但也有缺点就是要写的类更多,但整体来讲MVP架构仍是更好的选择编程

2.MVC

mvc是传统的项目架构,在Android项目中bash

  • m : model 实体层 具体的业务实体模型
  • v :view 视图层 相关布局文件 Activity和Fragment也属于视图
  • c : control 控制层 只具体的业务逻辑数据,view和model之间的交互(Activity 和Fragment)

(MVC架构)    
复制代码

(流程图 model和view彻底耦合到一块儿)网络

3.MVP

mvp是为了让view和model进行解耦,项目结构更加清晰,解放Activity架构

  • m : model 实体层 具体的业务实体模型
  • v:view 视图层 相关布局文件 Activity和Fragment
  • p : presenter 代理层 负责业务逻辑的梳理 ,view和modle之间的交互

4.MVP 和MVC的区别

上图明显的归纳出了mvc和mvp的不一样点,就是mvp是view和modle不直接交互,二者的交互交给presenter来处理,还有一点就是prsenter和view之间的交互是经过接口交互的mvc

5. Demo

我按照mvp的架构写了一个demo,demo是新闻列表的一个item,效果图以下ide

  • modle
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();
    }
}
复制代码
  • v view

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

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,写文章的脉络还不太熟悉,写的也比较慢,但愿本身愈来愈好吧,加油

相关文章
相关标签/搜索