首先穿件一个契约类(接口)。p层使用抽象类,m层和v层都使用内部接口来实现。
p层
abstract class OnePresenter{
public abstract void getLeftList(HashMap<String,String> params);
public abstract void getRightList(HashMap<String,String> params);
}
M层
public interface OneModel{
void getLeftList(HashMap<String,String> params, model.OneModel.OneModelCallBack oneModelCallBack);
void getRightList(HashMap<String,String> params, model.OneModel.OneModelCallBack oneModelCallBack);
}
v层
public interface OneView{
void leftSuccess(List<LeftBean.Data> leftbeanList);
void rightSuccess(List<RightBean.OneData> rightbeanList);
void leftFailure(String error);
void rightFailure(String error);
}
契约类创建完之后,再使用MVP框架。(开始创建model和presenter)。
model类-----实现契约类的model接口(model接口只有两个方法:getLeft和getRight)
@Override
public void getLeftList(HashMap<String, String> params, final OneModelCallBack oneModelCallBack) {
OKHttpUtils.getmInstance().doPost(ApiUrl.LEFT_URL, params, new OkHttpCallBack() {
@Override
public void failure(String msg) {
if(oneModelCallBack != null){
oneModelCallBack.leftFailure(msg);
}
}
@Override
public void success(String result) {
if(oneModelCallBack != null){
oneModelCallBack.leftSuccess(result);
}
}
});
}
@Override
public void getRightList(HashMap<String, String> params, final OneModelCallBack oneModelCallBack) {
OKHttpUtils.getmInstance().doPost(ApiUrl.RIGHT_URL, params, new OkHttpCallBack() {
@Override
public void failure(String msg) {
if(oneModelCallBack != null){
oneModelCallBack.rightFailure(msg);
}
}
@Override
public void success(String result) {
if(oneModelCallBack != null){
oneModelCallBack.rightSuccess(result);
}
}
});
}
最后创建一个model的内部接口
public interface OneModelCallBack{
void leftSuccess (String result);
void rightSuccess(String result);
void leftFailure(String error);
void rightFailure(String error);
}
presenter层---------继承契约类的p层(契约类的p层有两个方法:getLeftList和getRightList)
第一步:因为p层是MVP的桥梁,所以要有view和model层相连接,需要导入model和契约类里的view,然后实现构造方法。
private OneModel oneModel;
private OneContract.OneView view;
public OnePresenter(OneContract.OneView view) {
this.oneModel = new OneModel();
this.view = view;
}
@Override
public void getLeftList(HashMap<String, String> params) {
oneModel.getLeftList(params, new OneModel.OneModelCallBack() {
-------------------------------这个地方调用了model里面的方法和实现了model的内部接口---------------------------------------------
@Override
public void leftSuccess(String result) {
LeftBean leftBean = new Gson().fromJson(result,LeftBean.class);
List<LeftBean.Data> data = leftBean.data;
view.leftSuccess(data);
-------------------------------然后gson解析,解析完了之后data传参给契约类中的view---------------------------------------------
}
@Override
public void rightSuccess(String result) {
}
@Override
public void leftFailure(String error) {
}
@Override
public void rightFailure(String error) {
}
});
}
@Override
public void getRightList(HashMap<String, String> params) {
oneModel.getRightList(params, new OneModel.OneModelCallBack() {
@Override
public void leftSuccess(String result) {
}
@Override
public void rightSuccess(String result) {
RightBean rightBean = new Gson().fromJson(result,RightBean.class);
List<RightBean.OneData> data = rightBean.data;
view.rightSuccess(data);
}
@Override
public void leftFailure(String error) {
}
@Override
public void rightFailure(String error) {
}
});
}
若要使用OKhttp,就必须封装一个OKhttputils的类,和OKhttpcallback的接口用来回调请求成功和请求失败的方法。
OKhttputils
----------------------------------------handler机制,OKhttp,封装类的线程mInstance---------------------------------------------------
private Handler handler = new Handler();
private OkHttpClient okHttpClient;
private static OKHttpUtils mInstance;
----------------------------------------OKHttpUtils() 私有构造-------------------------------------------------------------------------
/**
* 私有构造
*/
private OKHttpUtils(){
//拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.writeTimeout(5,TimeUnit.SECONDS)
.connectTimeout(5,TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.build();
}
---------------------------------------- 创建实例,检验,单例模式进行实例化mInstance()------------------------------------------------------------
public static OKHttpUtils getmInstance() {
if(mInstance == null){
synchronized (OKHttpUtils.class){
if(mInstance == null){
mInstance = new OKHttpUtils();
}
}
}
return mInstance;
}
---------------------------------------- post请求------------------------------------------------------------------------------------------------------------------
public void doPost(String url,HashMap<String,String> params,final OkHttpCallBack httpCallBack){
FormBody.Builder formBody = new FormBody.Builder();
for(Map.Entry<String,String> map : params.entrySet()){
formBody.add(map.getKey(),map.getValue());
}
RequestBody requestBody = formBody.build();
//执行post请求
final Request request = new Request.Builder().url(url).post(requestBody).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(httpCallBack != null){
handler.post(new Runnable() {
@Override
public void run() {
httpCallBack.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(httpCallBack != null){
if(response.code() == 200){
final String result = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
httpCallBack.success(result);
}
});
}
}
}
});
}
----------------------------------------------------------get请求-------------------------------------------------------------------------------------------
/**
* get请求方式
*/
public void doGet(String url, HashMap<String,String> params,final OkHttpCallBack requestCallBack){
StringBuilder builder = new StringBuilder();
String nurl = url;
if(params != null && params.size()>0){
for(Map.Entry<String,String> map : params.entrySet()){
builder.append(map.getKey()).append("=").append(map.getValue()).append("&");
}
nurl = url+"?"+builder.toString();
}
//执行get请求
Request request = new Request.Builder().url(nurl).get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(requestCallBack != null){
handler.post(new Runnable() {
@Override
public void run() {
requestCallBack.failure("网络异常");
}
});
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String result = response.body().string();
if(requestCallBack != null){
handler.post(new Runnable() {
@Override
public void run() {
requestCallBack.success(result);
}
});
}
}
});
}
---------------------------------------- 全部关闭-----------------------------------------------------------------------------------------------------------------
public void cancelAllTask(){
if(okHttpClient != null){
okHttpClient.dispatcher().cancelAll();
}
}