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)项目结构:
- 每个页面都算一层,每一层中又有Presenter,Activity(Fragment)即view的体现层,model,Interface
(2)View层的接口定义
在MVP中Activity(Fragment)专注于视图,不做其它 。View的的表现,需要用interface接口来定义
首先我们要知道,我们要显示什么。这里直接把获取到的数据显示到,界面上。所以第一个接口就是显示数据
这里创建一个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层的桥梁。首先建立两个文件
先看看接口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是我们处理耗时函数的地方。
接口我也只定义从网络获取数据
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);
}
}
});
}
效果如图