加入OkHttpUtils的依赖
dependencies {
compile 'com.squareup.okhttp3:okhttp:3.9.1'
}
这里分成MVP模式,M层代码:
public class OkUtils {
//单例模式
private static volatile OkUtils intance;
private void OKUtils(){};
public static OkUtils setInstance(){
if(intance == null){
//二次封装
synchronized (OkUtils.class){
if(intance == null){
intance = new OkUtils();
}
}
}
return intance;
}
//实例化接口
private OkUtilsInterface okUtilsInterface;
public void setOkUtilsInterface(OkUtilsInterface okUtilsInterface){
this.okUtilsInterface = okUtilsInterface;
}
//定义一个Handler线程,发送到主线程
private Handler handler = new Handler();
//定义get请求
public void get(String url, final OkUtilsInterface okUtilsInterface, final Class bean, final String tag){
OkHttpClient okHttpClient = new OkHttpClient();
//添加拦截器(如果不要求,可以不做)
/*.Builder()
.addInterceptor(new Lanjie())
.build();*/
Request build = new Request.Builder()
.get()
.url(url)
.build();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
//请求网络失败的方法
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
okUtilsInterface.OkUtilsFailed(e.getMessage());
}
});
}
//请求网络成功的方法
@Override
public void onResponse(Call call, Response response) throws IOException {
//获取返回的Json串
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
//解析Json串
Object o = GsonUtils.setGson().fromJson(string, bean);
okUtilsInterface.OkUtilsSuccess(o,tag);
}
});
}
});
}
//post请求(跟上面差不多)
public void post(String url, Map<String,String> map, final OkUtilsInterface okUtilsInterface, final Class bean, final String tag){
OkHttpClient okHttpClient = new OkHttpClient();
//添加拦截器(如果不要求,可以不做)
/*.Builder()
.addInterceptor(new Lanjie())
.build();*/
//post请求,将拼接的参数通过Map集合放进body中
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String,String> entry:map.entrySet()){
builder.add(entry.getKey(),entry.getValue());
Log.e("-------",entry.getKey()+"------"+entry.getValue());
}
//在post中添加body,别忘了创建(.build)
Request build = new Request.Builder()
.post(builder.build())
.url(url)
.build();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
okUtilsInterface.OkUtilsFailed(e.getMessage());
}
});
}
@Override
public void onResponse(final Call call, Response response) throws IOException {
final String string = response.body().string();
Log.e("----------",string.toString());
handler.post(new Runnable() {
@Override
public void run() {
Object o = GsonUtils.setGson().fromJson(string, bean);
okUtilsInterface.OkUtilsSuccess(o,tag);
}
});
}
});
}
}
M层自定义接口::
public interface OkUtilsInterface {
void OkUtilsSuccess(Object o,String tag);
void OkUtilsFailed(String message);
}
P层代码:
public class Persenter {
//实例化接口
private PersenterInterface persenterInterface;
public void setPersenterInterface(PersenterInterface persenterInterface){
this.persenterInterface = persenterInterface;
}
//定义一个方法用来传递参数
public void get(String url, Class bean, final String tag){
//调用请求数据层的方法
OkUtils.setInstance().get(url, new OkUtilsInterface() {
@Override
public void OkUtilsSuccess(Object o,String tag) {
persenterInterface.PersenterSuccess(o,tag);
}
@Override
public void OkUtilsFailed(String message) {
persenterInterface.PersenterFailed(message);
}
},bean,tag);
}
//定义的post请求的方法
public void post(String url, Map<String,String> map, Class bean, final String tag){
OkUtils.setInstance().post(url, map, new OkUtilsInterface() {
@Override
public void OkUtilsSuccess(Object o,String tag) {
persenterInterface.PersenterSuccess(o,tag);
}
@Override
public void OkUtilsFailed(String message) {
persenterInterface.PersenterFailed(message);
}
},bean,tag);
}
}
P层接口
public interface PersenterInterface {
void PersenterSuccess(Object o,String tag);
void PersenterFailed(String message);
}
拦截器的代码块(不懂啥意思):
public class Lanjie implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request newRequest = chain.request().newBuilder()
.addHeader("source", "android")
.url(request.url())
.build();
return chain.proceed(newRequest);
}
}
Gson解析的类
public class GsonUtils {
public static Gson gson;
public static Gson setGson(){
if(gson == null){
synchronized (GsonUtils.class){
if(gson == null){
gson = new Gson();
}
}
}
return gson;
}
}
V层就不用写了,只需要实例化P类,在调用P层的方法,传进参数,实现接口,就能获取网络请求到的数据了….