您的位置:首页 > 移动开发 > Android开发

MVP in Android,让Activity更优雅一点。

2016-05-24 11:33 567 查看
我一直认为面向接口编程的设计才是最好的设计

之前我一直用的okhttp,利用request(url,params,callback)这种方式来获取结果。但是自从了解了retrofit,我毫不犹豫的替换了自己的网络请求框架。

为什么?因为retrofit是利用接口定义的请求。

@GET(url)
Call getXX(params1,params2);


要是哪天后台接口变了,需要增加一个参数,我不用去在代码里面慢慢去找哪里我用到了这个请求,也不需要利用IDE的崩溃来一个一个的去改。只需要修改这个接口

@GET(url)
Call getXX(params1,params2,params3);


这样所有用到这个请求的地方会自动报错,然后手动一个一个改即可。

话扯远了,不过这的确是面向接口编程的魅力之一。

既然面向接口编程这么有魅力,为什么不把整个android框架也设计成面向接口编程呢?代价仅仅是需要花几个小时去学习。

先讲优缺点再细讲MVP(我比较喜欢带目的性去看文章,而且先看缺点,缺点我都接受不了,我还看什么一大堆的MVP啊。)

先说MVP的缺点:

1、学习成本提高//这是不可避免的。
2、项目接口变多,一个activity往往会附带2个接口加一个实现类//只要项目结构设计的好,文件再多又有什么影响呢?只不过开发速度可能会稍有影响,
3、65535方法限制//个人感觉使用mvp模式会导致方法变多。相对于mvc来说会更容易突破65535。未测试,如果这条是错的,以后会更新。


再来说MVP的优点

1、层次条理清晰。//MVP严格执行自己任务,不会再像MVC中Activity既担任着Control又担任一部分View的功能了(这也是Activity在逻辑复杂之后几千行代码的原因)
2、Activity的减负。//想象一下Activity把几千行缩减到100行的画面。
3、面向接口、面向接口、面向接口。//代码很好管理,不用在几千行的代码里去找我这一部分逻辑在哪里。而只需要知道这个接口如何实现。


如果看到这里还能继续看下去,那就来看看MVP详解吧。(这一部分已经有很多大牛写的很不错了,我就分享一部分我觉得很容易理解的文章)

转载自http://blog.csdn.net/duo2005duo/article/details/50594757

MVP是MVC的衍生版本,跟MVC类似,但是在Android中更适用,也分三层:



Model:用于数据的增删改查等,也包括一些数据对象

View:用于界面的显示与用户操作的接收,在Android里面View通常就是Actvitiy,Fragment。

Presenter:是View跟Model的“中间人”,接收View的请求后,从Model获取数据交给View。

MVP&MVC

传统MVC有着悠久的历史,但是Android却选用MVP,这绝非偶然。

在MVC中:

M:解决用什么去渲染

V:解决怎么去渲染

C:解决用户输入事件



在Android中,假如使用MVC,代表V的layout资源并不能完全解决怎么去渲染的问题,还需要Activity的辅助,所以Activity也必然要代表V;但是同时,Activity一方面拥有生命周期回调,另外一方面还为View设置监听,Activity接收来自用户的输入,所以Activity也必然也代表C,Activity就像一个万能对象同时代表着V与C。因此,使用MVC并不能很好地将V与C分离开来。

与MVC不同的是,MVP中的View是可以接收用户输入,同时也能解决怎么去渲染的问题,所以Activity可以作为MVP里面的View,但是却做不了MVC里面的View。因此,MVP更适用于Android。

但是View的改变不只在此:View在一方面增加了接收事件的责任,又在另一方面减少了操作Model的责任。View不再直接操作Model,只能通过Presenter去Model操作数据。可以说,MVC中的View与Control交换了部分工作,就成了现在的MVP。

总的来说,MVP:逻辑部分全部由Presenter负责,Activity只负责界面相关,无任何逻辑,数据由接口回调过来,Activity只需要展示数据。

例子:

展示天气。

//最终效果



presenter:

public interface MainPresenter {
void loadData();
}


presenter实现类

public class MainPresenterImpl implements MainPresenter {
//用来回调给View数据
MainView mainView;

String url = "http://wthrcdn.etouch.cn/weather_mini?city=深圳";
private final OkHttpClient client = new OkHttpClient();

public MainPresenterImpl(MainView mainView) {
super();
this.mainView = mainView;
}

//presenter接口的实现方法
@Override
public void loadData() {
//本例是在onCreate()中调用的loadData,所以handler在主线程中
final Handler handler = new Handler();
//okhttp异步get请求数据
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {

@Override
public void onResponse(Response arg0) throws IOException {
Gson gson = new Gson();
WeatherModel Weather = gson.fromJson(arg0.body().string(), WeatherModel.class);
//在请求到数据后调用。相对应的activity也会在请求到数据后触发这个事件
handler.post(new Runnable() {

@Override
public void run() {
mainView.setWendu(Weather.getData().getWendu());
mainView.setGanmao(Weather.getData().getGanmao());
mainView.setCity(Weather.getData().getCity());
}
});

}

@Override
public void onFailure(Request arg0, IOException arg1) {
}
});
}
}


View的接口

public interface MainView {
void setWendu(String wendu);
void setGanmao(String ganmao);
void setCity(String city);
}


MainActivity:

public class MainActivity extends Activity implements MainView{

MainPresenter presenter;
TextView tv_wendu,tv_ganmao,tv_city;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new MainPresenterImpl(this);
tv_wendu = (TextView) findViewById(R.id.tv_wendu);
tv_ganmao = (TextView) findViewById(R.id.tv_ganmao);
tv_city = (TextView) findViewById(R.id.tv_city);
presenter.loadData();
}
//通过接口回调数据
@Override
public void setWendu(String wendu) {
tv_wendu.setText(wendu);
}

@Override
public void setGanmao(String ganmao) {
tv_ganmao.setText(ganmao);
}

@Override
public void setCity(String city) {
tv_city.setText(city);
}

}


总结:

1、Android中要使用MVP,需要2个实现类,2个接口。即:

ActivityImpl+ActivityInterface.

PresenterImpl+PresenterInterface

2、Activity中只需要实现setXXX,getXXX所有跟界面相关的。所有的数据逻辑处理在Presenter。

3、MVP是一个设计麻烦,但是改动简单的一种设计框架。

本例demo

下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android mvp 设计