欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 从新学习之MVP模式

程序员文章站 2022-06-08 22:24:56
...

Android 从新学习之MVP模式

这是为自己记录一点记忆

1.MVC与MVP模式

1.MVC即Model-View-Controller。M:逻辑模型,V:视图模型,C:控制器

2、MVP即Model-View-Presenter。M:逻辑模型,V:视图模型,P:表示器

这里不做过多解释,大家应该都懂

2.MVP实战

直接写一段从网络获取数据的案例

(1)项目结构:

  1. 每个页面都算一层,每一层中又有Presenter,Activity(Fragment)即view的体现层,model,Interface

(2)View层的接口定义

在MVP中Activity(Fragment)专注于视图,不做其它 。View的的表现,需要用interface接口来定义
首先我们要知道,我们要显示什么。这里直接把获取到的数据显示到,界面上。所以第一个接口就是显示数据

Android 从新学习之MVP模式
这里创建一个IShowDataView的接口

public interface IShowDataView {
    public void ShowBlogData(String blog);
    public void showWaitingDialog();
    public void dissmissWaitingDialog();
}

这里面用有三个接口
1.显示数据

public void ShowBlogData(String blog);

2.显示进度条

public void showWaitingDialog();

3.销毁进度条

public void dissmissWaitingDialog();

接口文件定义完毕了,那么我们要去Activity里面实现它。

public class MainActivity extends AppCompatActivity implements IShowDataView {

    private Button btn_get_data;
    private TextView tv_show_data;
    private ProgressBar pb_get_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    @Override
    public void ShowBlogData(String blog) {

    }

    @Override
    public void showWaitingDialog() {

    }

    @Override
    public void dissmissWaitingDialog() {

    }
    private void initView() {
        btn_get_data=(Button)findViewById(R.id.btn_get_data);
        tv_show_data=(TextView)findViewById(R.id.tv_show_data);
        pb_get_data=(ProgressBar)findViewById(R.id.pb_get_data);
    }
}

(2)Presenter层的接口定义

这是我们连接model和view层的桥梁。首先建立两个文件
Android 从新学习之MVP模式
先看看接口IBlogPresenter

public interface IBlogPresenter {
            public void GetDataToModel();//从Model获取数据
            public void DataToViewShow(String data); //向View发送数据
}

这里只写了一个接口就是从Model获取数据
暂时BlogPresenter里面就成了这样

public class BlogPresenter implements IBlogPresenter{
    private IShowDataView mIshowDataView;
    public BlogPresenter(IShowDataView mIshowDataView){   
        this.mIshowDataView=mIshowDataView;
    }

    @Override
    public void GetDataToModel() {        //从model获取数据

    }
     //得到数据后向View层传数据
    @Override
    public void DataToViewShow(String data) {
    }
}

(3)Model层的接口定义

model是我们处理耗时函数的地方。
Android 从新学习之MVP模式
接口我也只定义从网络获取数据

public interface IGetDataModel  {
      void GetBlogToNet(IBlogPresenter iBlogPresenter);            //从网络获取数据
}

我的model文件也就有了如下图


public class GetDataModel implements IGetDataModel {
    @Override
    public void GetBlogToNet(IBlogPresenter iBlogPresenter) {     //从网络获取数据

    }
}

(4)开始实现mvp

1.view->Presenter
  从视图界面出发,用户首先是要请求数据,而Presenter是具体实现者,所以Presenter要提供方法代View的实现者调用,View的实现中必须要有Presenter的引用。
public class MicroblogPresenterCompl  implements IMicroblogPresenter,IOnInterListener{
    .......
    private IShowDataView mIshowDataView;
    private GetInterDataModel getInterDataModel;
    .......
    }

首先从view向presenter发起请求

btn_get_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                blogPresenter.GetDataToModel();   //view层向Presenter层发起数据请求

            }
        });
2.Presenter->Model
 从桥梁角度出发,接受到view层的数据请求,然而Presenter没有数据,这个时候,Presenter向Model层发起数据请求
public class BlogPresenter implements IBlogPresenter{
    ......
    private IGetDataModel iGetDataModell=new GetDataModel();
     ......
    //供View层调用,并且向model层请求数据
    @Override
    public void GetDataToModel() {
         mIshowDataView.showWaitingDialog();  //显示进度条
         iGetDataModell.GetBlogToNet(this);   //因为实现了接口IBlogPresenter,所以传入this是ok的
    }
}
3.Model->Presenter
 从model角度来看,从网络获取到了数据,应该要推送回Presenter的,所以GetBlogToNet的实现我模拟了一下网络请求
 @Override
    public void GetBlogToNet(final IBlogPresenter iBlogPresenter) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //模拟网络耗时
                    Thread.sleep(6000);
                    String info = "hello word";
                    iBlogPresenter.DataToViewShow(info);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }

并且将数据。通过 iBlogPresenter.DataToViewShow(info);发送给了Presenter

4.Presenter->View

当model层调用DataToViewShow(info)的时候,此时我们可以实现DataToViewShow(String data)方法,将数据传输给View层,并且取消掉进度条

 //得到数据后向View层传数据
    @Override
    public void DataToViewShow(String data) {
        mIshowDataView.ShowBlogData(data);
        mIshowDataView.dissmissWaitingDialog();
    }
5.View层展示

下面分别是,显示数据,进度条显示,和进度条消失(注意,因为我这里没有把线程转到主线程,所以这里显示都需要到UI线程上来,实际应用,需要改变,获取数据方式,比如使用RxJava+Retrofit,这些可以很好的配合)

    private Button btn_get_data;  //获取数据按钮
    private TextView tv_show_data;//显示数据
    private ProgressBar pb_get_data;//进度条
   @Override
    public void ShowBlogData(final String blog) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(tv_show_data != null ){
                    tv_show_data.setText(blog);
                }
            }
        });
    }

    @Override
    public void showWaitingDialog() {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(pb_get_data != null ){
                    pb_get_data.setVisibility(View.VISIBLE);
                }
            }
        });
    }

    @Override
    public void dissmissWaitingDialog() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if(pb_get_data != null ){
                    pb_get_data.setVisibility(View.GONE);
                }
            }
        });

    }

效果如图
Android 从新学习之MVP模式

相关标签: mvp模式