初探MVP

今天估计是这学期最后一天花这么多时间在Android上了,因为接下来的一段时间里,我将会不断的考试不断的做实验不断的课程设计,而偏偏我是个学粉。。学渣已经形容不了我了,现在的状态真的是渣都不剩了。不过还好还好有自己喜欢的事,有事没事可以看看书看看博客撩撩妹。今天写一下关于MVP架构的,我尽量将我这个初学者思考过程说清楚。不扯淡先看看今天的demo的预览图。

初探MVP_第1张图片
阿拉蕾
开波

本来我也想先给大家说说什么是MVC然后MVP怎样来的,然后摔出一大堆官方的文档,接着说自己的感受。但是这些基本那些介绍MVP的博文都会说到,我就不说了,因为MVC的话,个人觉得你在写大一点的Demo时自然而然的就会抽取提炼,那大概就是MVC了吧?大差不差。那么什么是MVP呢?下面po图(第一次画图我知道丑不过先将就着吧):

初探MVP_第2张图片
MVP

上面的图其实已经说清楚了什么是 MVP

  1. View层仅负责加载视图(Activity or Fragment)与用户交互(键盘输入),不处理业务逻辑。
  2. Model层负责处理业务。
  3. Presenter层负责控制两者之间的交往?(用这个次准确吗),因此Presenter必须揣有ViewModel的实例。
    要点就这三点,下面在代码中说明吧。

中场

看代码总是最轻松的,下图即为demo的java文件。


初探MVP_第3张图片
Demo

我先介绍一下各部分的作用:

  1. config因为此次顺带复习了一溜Retorfit,所以CallServiceRetrofit的接口,Config则是我在聚合数据拿的一个新闻APi。在此谢谢阿里妈妈和马云爹爹。
  2. model是业务层,里面有NewInfo这个接收解析后Json数据的实体bean,NewLogic则是业务逻辑处理类,INewCallBack是一个监听网络请求后的回调。
  3. presenter是用以给model和view交互的中间人
  4. 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 map, final INewCallBack callBack){
        Call call = callService.getNewInfo(map);

        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                if (response.isSuccessful()){
                    callBack.onSucceed(response);
                }else{
                    callBack.onFailure("获取新闻信息失败");
                }
            }

            @Override
            public void onFailure(Call 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 map = new HashMap<>();
    map.put("type","tiyu");
    map.put("key", Config.KEY);
    mNewsLogic.getNew(map, new INewCallBack() {
        @Override
        public void onSucceed(Response 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地址。


运行效果:
初探MVP_第4张图片
效果
如果你觉得本文有所错漏,麻烦留言指出,交流学习共同进步。

你可能感兴趣的:(初探MVP)