首先声明:本blog参考于http://wuxiaolong.me/2015/09/23/AndroidMVPSample/
感谢作者这篇文章
android开发现在越来越离不开mvp模式了,也许你刚开始用感觉很不顺手,但是,MVP确实要代替mvc的上次写的mvp感觉太水,所以这次又开了一篇,供大家参考。
先看我的目录图:
JsonUtils是gson封装的json解析工具类,待会我也会贴出。
在贴代码之前我先说下大体的实现逻辑:
- UI(Activity、Fragment)实现View层方法,引用Presenter
- Presenter调用Model,调用Model具体逻辑
- Model逻辑实现,回传给Presenter方法
- Presenter回传给View,即回到UI,回传View方法
代码:
BaseView.java
/**
* Created by QLY on 2016/11/9.
* 界面显示逻辑
*/
public interface BaseView {
void showData(WheatherBean bean);
void showProgress();
void hideProgress();
}
Presenter.java:
public interface Presenter<V>{
/**
* 依附view
* @param view
*/
void attachView(V view);
/**
* 解绑view
*/
void detachView();
/**
* 加载成功回传数据
* bean应该抽取为基类(Object)
* @param bean
*/
void loadDataSuccess(WheatherBean bean);
/**
* 加载失败
*/
void loadDataFailure();
}
BaseModel.java:
public class BaseModel {
Presenter mainPresnter;
public BaseModel(Presenter mainPresnter) {
this.mainPresnter = mainPresnter;
}
/**
* 实际加载数据的逻辑
*/
public void loadData() {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url("").build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
mainPresnter.loadDataFailure();
}
@Override
public void onResponse(Response response) throws IOException {
String data = response.body().string();
WheatherBean bean= JsonUtils.parse(data, WheatherBean.class);
/**
* 加载回来的数据回传给prenster
*/
mainPresnter.loadDataSuccess(bean);
}
});
}
}
MainPresenter.java:
public class MainPresenter implements Presenter<BaseView> {
private BaseView baseView;
private BaseModel baseModel;
public MainPresenter(BaseView baseView) {
attachView(baseView);
baseModel = new BaseModel(this);
}
@Override
public void attachView(BaseView view) {
this.baseView = view;
}
@Override
public void detachView() {
this.baseView = null;
}
@Override
public void loadDataSuccess(WheatherBean bean) {
baseView.showData(bean);
baseView.hideProgress();
}
@Override
public void loadDataFailure() {
}
/**
* 加载数据方法共外部调用,但实际加载的逻辑在model层
*/
public void loadData() {
baseView.showProgress();
//加载数据的实际的调用
baseModel.loadData();
}
}
WheatherBean.java:
/**
* Created by QLY on 2016/11/9.
*/
public class WheatherBean {
private String city;
private String wd;
private String ws;
private String time;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getWd() {
return wd;
}
public void setWd(String wd) {
this.wd = wd;
}
public String getWs() {
return ws;
}
public void setWs(String ws) {
this.ws = ws;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
JsonUtils.java:
public class JsonUtils {
private static final String TAG = "JsonUtil";
/**
* json转换成类
*
* @param data
* @param class1
* @return
*/
public static <T> T parse(String data, Class<T> class1) {
return new Gson().fromJson(data, class1);
}
/**
* json转换成列表
*
* @param data
* @param class1
* @return
*/
public static <T> List<T> parseList(String data, Class<T> class1) {
if (TextUtils.isEmpty(data)) {
return null;
}
List<T> mList = new ArrayList<T>();
try {
JSONArray mArray = new JSONArray(data);
final int size = mArray.length();
for (int i = 0; i < size; i++) {
T t = parse(mArray.getJSONObject(i).toString(), class1);
mList.add(t);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mList;
}
}
代码就这么多,现在我们走下流程:
1、activity入口presnter调用方法拉取数据
2、presnter内部调用model层去真实的执行网络操作
3、model层加载成功,回传给presnter
4、presnter调用view的显示数据方法
5、view把数据设置到界面
源码:github