封装okhttp
来源:互联网 发布:linux nobody启动程序 编辑:程序博客网 时间:2024/06/01 13:47
import android.os.Handler;
import android.os.Looper;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class OkHttpUtils {
private Context context;
private static OkHttpUtils okHttpUtils;
private final Gson gson;
private final OkHttpClient client;
private final Handler handler;
private OkHttpUtils() {
// client = new OkHttpClient();// gson = new Gson();// //构造一个handler,不管是从哪个哪个线程中发出消息,// // 消息都会发送到主线程的messagequeue中// handler = new Handler(Looper.getMainLooper()); OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addInterceptor(new LoggingIntercepto()); client = builder.build(); gson = new Gson(); //构造一个handler,不管是从哪个哪个线程中发出消息, // 消息都会发送到主线程的messagequeue中 handler = new Handler(Looper.getMainLooper());
}
public static OkHttpUtils getInstace() {
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
if (okHttpUtils == null) {
okHttpUtils = new OkHttpUtils();
}
}
}
return okHttpUtils;
}
public void doGet(String url,MyHttpCallback callback){
Request request= new Request.Builder().url(url).get().build();
doRequest(request,callback);
}
//post方法. username password
public void doPost(String url, Map<String ,String> params, MyHttpCallback callback){
FormBody.Builder formBuilder=new FormBody.Builder();
if(params!=null){
for (Map.Entry<String,String> entry:params.entrySet()) {
formBuilder.add(entry.getKey(),entry.getValue());
}
}
RequestBody body=formBuilder.build();
Request.Builder builder =new Request.Builder().url(url).post(body).addHeader("User-Agent", "OkHttp Example");//拦截器
Request request = builder.build();
doRequest(request,callback);
}
private void doRequest(Request request, final MyHttpCallback callback) {
callback.onBeforeRequest(request);
client.newCall(request).enqueue(new Callback() {
//这些okhttp的回调方法执行在子线程里面,返回的数据为了给主线程使用,
// 必须想办法把数据供给主线程使用,所以引用了自定义的回调接口
@Override
public void onFailure(final Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(call,e);
}
});
}
@Override
public void onResponse(Call call,final Response response) throws IOException {
if(response.isSuccessful()){
//返回数据成功的话就解析json串
String json=response.body().string();
final Object o=gson.fromJson(json,callback.type);//将json解析成对应的bean
//handler 除了可以发送Message 也可以发送 runnable对象
//这个runnable对象的run方法就执行在 handler对应的线程中 当前的案例中 会执行在主线程中
handler.post(new Runnable() {
@Override
public void run() {
//将response返回给主线程
try {
callback.onSuccess(response,o);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}else{
handler.post(new Runnable() {
@Override
public void run() {
try {
callback.onError(response,"服务器返回错误");
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
});
}
}
//回调接口
import com.google.gson.internal.$Gson$Types;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.Response;
public abstract class MyHttpCallback<T> {
Type type;
static Type getSuperclassTypeParameter(Class<?> subclass){
Type superclass =subclass.getGenericSuperclass();
if(superclass instanceof Class){
throw new RuntimeException("Missing type parameter");
}
ParameterizedType parameterized=(ParameterizedType)superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public MyHttpCallback(){
type=getSuperclassTypeParameter(getClass());
}
public abstract void onBeforeRequest(Request request);
public abstract void onFailure(Call call, IOException e);
public abstract void onSuccess(Response response, T t) throws IOException;
public abstract void onError(Response response,String errorMsg) throws IOException;
}
//拦截器类
import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;
public class LoggingIntercepto implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); System.out.println(String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); System.out.println(String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response; }}
//使用方法 MVP使用
M层
public class Model_A { private SS ss; public interface SS{ void Success(Shop shop); } public void setSs(SS ss) { this.ss = ss; } public void news(String url) { OkHttpUtils.getInstace().doGet(url, new MyHttpCallback<Shop>() { @Override public void onBeforeRequest(Request request) { } @Override public void onFailure(Call call, IOException e) { } @Override public void onSuccess(Response response, Shop shop) throws IOException { ss.Success(shop); } @Override public void onError(Response response, String errorMsg) throws IOException { } }); }}V层public interface View_A { void Success(Shop shop);}P层public class Presenter_A implements Model_A.SS { private Model_A model_a; private View_A view_a; public Presenter_A(View_A view_a) { this.view_a = view_a; model_a=new Model_A(); model_a.setSs(this); } public void shop(String url){ model_a.news(url); } @Override public void Success(Shop shop) { view_a.Success(shop); }}Fragment里调用的接口
继承view层
实例化p层pa=new Presenter_A(this);pa.shop(Api.GOUWU);@Overridepublic void Success(Shop shop) { try{ final List<Shop.DataBean> data = shop.getData(); getActivity().runOnUiThread(new Runnable() { @Override public void run() { sa=new ShopOneAdapter(getActivity(),data); rv.setLayoutManager(new LinearLayoutManager(getActivity())); rv.setAdapter(sa); } }); }catch (Exception e){ e.printStackTrace(); }}
- okhttp封装okhttp-utils
- 封装OKHttp
- 封装OkHttp
- okhttp封装
- 封装OKHttp
- 封装OKHttp
- Okhttp封装
- OkHttp 封装
- OkHttp封装
- OKHttp封装
- Okhttp封装
- okHttp封装
- OkHttp封装
- Okhttp封装
- 封装okhttp
- okhttp封装
- 封装okhttp
- Okhttp封装
- win7,64位,anaconda搭建TensorFlow
- 第七届蓝桥杯大赛个人赛省赛(软件类)java语言B组第八题:四平方和
- 发货和待发货的切换(自己封装data数据)
- Java笔记第八课(多态&抽象类&接口)
- Android-new-build-system
- 封装okhttp
- ViewPage添加小圆点
- 实用的手机扫描识别车牌号
- Linux(Ubuntu14.04)+MySQL Community Server 5.7.17安装(5.7.17deb安装包)
- 40个Java多线程问题总结
- CentOS7安装使用selenuim+chrome
- ipa重签名
- linux下mysql大小写区分设置
- [构造 分块] Codeforces #576C. Points on Plane