1View层的接口Iview
package com.example.guoxinyu20181220.view;
public interface Iview<E> {
void requestData(E e);
void requestFail(E e);
}
2.V层实现类(可以是Activity也可以是Fragment)
package com.example.guoxinyu20181220;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.guoxinyu20181220.presenter.PresenterImpl;
import com.example.guoxinyu20181220.view.Iview;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements Iview {
private PresenterImpl presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
presenter = new PresenterImpl(this);
initView();
initData();
}
//请求 网络地址调用p层方法
private void initData() {
/* Map<String,String> map = new HashMap<>();
map.put("page",String.valueOf(1));*/
//presenter.startRequest("网络接口","map集合chuancan","对应的bean类");
}
//初始化view
private void initView() {
//TODO
}
@Override
public void requestData(Object o) {
}
@Override
public void requestFail(Object o) {
}
//防止内存泄漏调用p层的方法
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDetach();
}
}
3.P层的接口
package com.example.guoxinyu20181220.presenter;
import java.util.Map;
public interface Ipresenter {
void startRequest(String url, Map<String,String> map,Class clazz);
}
4.P层的实现类
package com.example.guoxinyu20181220.presenter;
import com.example.guoxinyu20181220.MainActivity;
import com.example.guoxinyu20181220.model.ModelImpl;
import com.example.guoxinyu20181220.view.Iview;
import java.util.Map;
public class PresenterImpl implements Ipresenter {
private Iview mIview;
private ModelImpl model;
public PresenterImpl(Iview iview) {
mIview = iview;
model = new ModelImpl();
}
@Override
public void startRequest(String url, Map<String, String> map, Class clazz) {
//通过M层调用M层方法
//model.requestData();
}
//防止内存泄漏
public void onDetach(){
if(model!=null){
model = null;
}
if(mIview!=null){
mIview = null;
}
}
}
5.M层接口
package com.example.guoxinyu20181220.model;
import java.util.Map;
public interface Imodel {
void requestData(String url, Map<String,String> map,Class clazz,MyCallBack myCallBack);
}
6.在创建一个接口为了给P层传递数据
package com.example.guoxinyu20181220.model;
public interface MyCallBack<E> {
void setData(E data);
}
7.M层的实现类
package com.example.guoxinyu20181220.model;
import com.example.guoxinyu20181220.util.OkHttpUtils;
import java.util.Map;
public class ModelImpl implements Imodel {
private MyCallBack myCallBack;
@Override
public void requestData(String url, Map<String, String> map, Class clazz, MyCallBack myCallBack) {
this.myCallBack = myCallBack;
//调用工具类
//post请求
//OkHttpUtils.getIntance().doPost();
//get请求
//OkHttpUtils.getIntance().doGet();
}
}
8.Okhttp网络请求工具类需要创建一个接口ICallBack
package com.example.guoxinyu20181220.util;
public interface ICallBack {
void success(Object o);
void faniled(Exception e);
}
9.Okhttp工具类里面封装了get和post请求
package com.example.guoxinyu20181220.util;
import android.os.Handler;
import android.os.Looper;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpUtils {
private static OkHttpUtils intance;
private final OkHttpClient httpClient;
private Handler handler = new Handler(Looper.myLooper());
public OkHttpUtils() {
//日志拦截器
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient = new OkHttpClient.Builder()
.connectTimeout(10,TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
}
public static OkHttpUtils getIntance() {
if(intance == null){
synchronized (OkHttpUtils.class){
intance = new OkHttpUtils();
}
}
return intance;
}
/**
* 异步get请求
* */
public void doGet(String url, String params, final Class clazz, final ICallBack iCallBack){
Request request = new Request.Builder()
.url(url)
.get()
.build();
Call call = httpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.faniled(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(result, clazz);
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.success(o);
}
});
}catch (Exception e){
iCallBack.faniled(e);
}
}
});
}
/**
* 异步post请求
* */
public void doPost(String url, Map<String,String> map, final Class clazz, final ICallBack iCallBack){
FormBody.Builder builder = new FormBody.Builder();
for(Map.Entry<String,String> entry:map.entrySet()){
builder.add(entry.getKey(),entry.getValue());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = httpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.faniled(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
String result = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(result, clazz);
handler.post(new Runnable() {
@Override
public void run() {
iCallBack.success(o);
}
});
}catch (Exception e){
iCallBack.faniled(e);
}
}
});
}
}