封装OKHttp
2017-01-02 19:52
106 查看
import android.os.Handler;
import android.os.Looper;
import com.google.gson.Gson;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class OkHttpUtil {
private static OkHttpUtil mOkHttpUtil;
private Gson mGson;
private Handler mHandler;
private OkHttpClient mOkHttpClient;
private OkHttpUtil(){
//实例化Gson
mGson = new Gson();
//实例化主线程的Handler
mHandler = new Handler(Looper.getMainLooper());
//实例化OkHttpClient
mOkHttpClient = new OkHttpClient();
}
public static OkHttpUtil getInstance(){
if(mOkHttpUtil == null){
synchronized (OkHttpUtil.class){
if(mOkHttpUtil == null){
mOkHttpUtil = new OkHttpUtil();
}
}
}
return mOkHttpUtil;
}
/**
*
* get请求
*
* @param url 请求的Url
* @param clazz 实体Bean
* @param callBack 回调接口
* @param <T> Bena类型
*/
public <T>void requestJson2Bean(String url, final Class<T> clazz, final RequestJson2BeanCallBack<T> callBack){
//实例化Request
Request request = new Request.Builder().url(url).build();
//请求网络
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
//回调失败的方法
callBack.error();
}
});
}
@Override
public void onResponse(Response response) throws IOException {
//得到json串
String json = response.body().string();
final T result = mGson.fromJson(json, clazz);
//转换到主线程回调接口
mHandler.post(new Runnable() {
@Override
public void run() {
//回调成功的方法
callBack.success(result);
}
});
}
});
}
/**
*
*post请求
*
* @param url 请求的Url
* @param callBack 回调借口 OkHttp默认为子线程已更换为主线程 可在回调的方法中直接更新UI
* @param param
* @param <T>
*/
public <T>void requestJson2Bean(String url, final Class<T> clazz , final RequestJson2BeanCallBack<T> callBack, Param... param){
//调用自定义封装方法 该方法将请求参数封装到Request对象中 并返回
Request request = builderPostRequest(url,param);
//请求数据
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
//回调失败的方法
callBack.error();
}
@Override
public void onResponse(Response response) throws IOException {
//得到json串
String json = response.body().string();
final T result = mGson.fromJson(json, clazz);
mHandler.post(new Runnable() {
@Override
public void run() {
//回调成功的方法
callBack.success(result);
}
});
}
});
}
/**
*
* @param url 请求的Urkl
* @param params post请求的参数 存储在对象中
* @return 封装好的Request对象
*/
private Request builderPostRequest(String url, Param[] params) {
//实例化FormEncodingBuilder对象
FormEncodingBuilder builder = new FormEncodingBuilder();
//对请求参数进行判空
if(params == null){
params = new Param[0];
}
for(Param param : params){
builder.add(param.key,param.value);
}
RequestBody requestBody = builder.build();
//创建Request对象
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
return request;
}
public interface RequestJson2BeanCallBack <T>{
void success(T result);
void error();
}
//自定义存储类 存储类型为键值对 用于Post请求
public static class Param{
public String key;
public String value;
public Param() {
}
public Param(String key, String value) {
this.key = key;
this.value = value;
}
}
}
-----------------------------------------------------------------------------------切割线----------------------------------------------------------------------------------------
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.bawei.custiomapplication.Bean.NewsBean;
import com.bawei.custiomapplication.api.HttpRequest;
public class MainActivity extends AppCompatActivity {
private HttpRequest mOkHttpUtil;
//post请求的Url与参数
private String url_ost = "http://v.juhe.cn/toutiao/index";
private String param = "type=top&key=10caa939d6a0a3981591e2d0853cb469";
//get请求 拼接的Url
private String url_get = "http://v.juhe.cn/toutiao/index?type=top&key=10caa939d6a0a3981591e2d0853cb469";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得okHttpUtil对象
mOkHttpUtil = HttpRequest.getInstance();
//post演示
mOkHttpUtil.requestJson2Bean(url_ost, NewsBean.class, new HttpRequest.RequestJson2BeanCallBack<NewsBean>() {
@Override
public void success(NewsBean result) {
Log.d("TAG",result.getResult().getData().get(0).getTitle());
}
@Override
public void error() {
}
},new HttpRequest.Param("type","top"),new HttpRequest.Param("key","10caa939d6a0a3981591e2d0853cb469"));
//get演示
mOkHttpUtil.requestJson2Bean(url_get, NewsBean.class, new HttpRequest.RequestJson2BeanCallBack<NewsBean>() {
@Override
public void success(NewsBean result) {
Log.d("TAG",result.getResult().getData().get(0).getTitle());
}
@Override
public void error() {
}
});
}
}
import android.os.Looper;
import com.google.gson.Gson;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class OkHttpUtil {
private static OkHttpUtil mOkHttpUtil;
private Gson mGson;
private Handler mHandler;
private OkHttpClient mOkHttpClient;
private OkHttpUtil(){
//实例化Gson
mGson = new Gson();
//实例化主线程的Handler
mHandler = new Handler(Looper.getMainLooper());
//实例化OkHttpClient
mOkHttpClient = new OkHttpClient();
}
public static OkHttpUtil getInstance(){
if(mOkHttpUtil == null){
synchronized (OkHttpUtil.class){
if(mOkHttpUtil == null){
mOkHttpUtil = new OkHttpUtil();
}
}
}
return mOkHttpUtil;
}
/**
*
* get请求
*
* @param url 请求的Url
* @param clazz 实体Bean
* @param callBack 回调接口
* @param <T> Bena类型
*/
public <T>void requestJson2Bean(String url, final Class<T> clazz, final RequestJson2BeanCallBack<T> callBack){
//实例化Request
Request request = new Request.Builder().url(url).build();
//请求网络
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
mHandler.post(new Runnable() {
@Override
public void run() {
//回调失败的方法
callBack.error();
}
});
}
@Override
public void onResponse(Response response) throws IOException {
//得到json串
String json = response.body().string();
final T result = mGson.fromJson(json, clazz);
//转换到主线程回调接口
mHandler.post(new Runnable() {
@Override
public void run() {
//回调成功的方法
callBack.success(result);
}
});
}
});
}
/**
*
*post请求
*
* @param url 请求的Url
* @param callBack 回调借口 OkHttp默认为子线程已更换为主线程 可在回调的方法中直接更新UI
* @param param
* @param <T>
*/
public <T>void requestJson2Bean(String url, final Class<T> clazz , final RequestJson2BeanCallBack<T> callBack, Param... param){
//调用自定义封装方法 该方法将请求参数封装到Request对象中 并返回
Request request = builderPostRequest(url,param);
//请求数据
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
//回调失败的方法
callBack.error();
}
@Override
public void onResponse(Response response) throws IOException {
//得到json串
String json = response.body().string();
final T result = mGson.fromJson(json, clazz);
mHandler.post(new Runnable() {
@Override
public void run() {
//回调成功的方法
callBack.success(result);
}
});
}
});
}
/**
*
* @param url 请求的Urkl
* @param params post请求的参数 存储在对象中
* @return 封装好的Request对象
*/
private Request builderPostRequest(String url, Param[] params) {
//实例化FormEncodingBuilder对象
FormEncodingBuilder builder = new FormEncodingBuilder();
//对请求参数进行判空
if(params == null){
params = new Param[0];
}
for(Param param : params){
builder.add(param.key,param.value);
}
RequestBody requestBody = builder.build();
//创建Request对象
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
return request;
}
public interface RequestJson2BeanCallBack <T>{
void success(T result);
void error();
}
//自定义存储类 存储类型为键值对 用于Post请求
public static class Param{
public String key;
public String value;
public Param() {
}
public Param(String key, String value) {
this.key = key;
this.value = value;
}
}
}
-----------------------------------------------------------------------------------切割线----------------------------------------------------------------------------------------
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.bawei.custiomapplication.Bean.NewsBean;
import com.bawei.custiomapplication.api.HttpRequest;
public class MainActivity extends AppCompatActivity {
private HttpRequest mOkHttpUtil;
//post请求的Url与参数
private String url_ost = "http://v.juhe.cn/toutiao/index";
private String param = "type=top&key=10caa939d6a0a3981591e2d0853cb469";
//get请求 拼接的Url
private String url_get = "http://v.juhe.cn/toutiao/index?type=top&key=10caa939d6a0a3981591e2d0853cb469";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得okHttpUtil对象
mOkHttpUtil = HttpRequest.getInstance();
//post演示
mOkHttpUtil.requestJson2Bean(url_ost, NewsBean.class, new HttpRequest.RequestJson2BeanCallBack<NewsBean>() {
@Override
public void success(NewsBean result) {
Log.d("TAG",result.getResult().getData().get(0).getTitle());
}
@Override
public void error() {
}
},new HttpRequest.Param("type","top"),new HttpRequest.Param("key","10caa939d6a0a3981591e2d0853cb469"));
//get演示
mOkHttpUtil.requestJson2Bean(url_get, NewsBean.class, new HttpRequest.RequestJson2BeanCallBack<NewsBean>() {
@Override
public void success(NewsBean result) {
Log.d("TAG",result.getResult().getData().get(0).getTitle());
}
@Override
public void error() {
}
});
}
}
相关文章推荐
- charles mac下https抓包和iphone https抓包
- HTTP协议
- [其他]CCNA网络工程学习笔记
- 以wifi-example-sim.cc为例说明NS3统计数据模型
- Android网络——C/S通信
- 虚拟机安装Centos7 , 没有可用的网络设备【ifconfig 只有lo而没有eth0的解决办法】
- 线性规划与网络流
- OKHttp源码分析
- 不要怂,就是GAN (生成式对抗网络) (一): GAN 简介
- Centos7部署lamp: httpd2.4+fpm模式
- Centos7部署lamp: httpd2.4(prefork)+module模式
- Centos7部署lamp: httpd2.4(event)+module模式
- Centos6部署lamp: httpd2.4+fpm模式
- 计算机网络协议层次
- Java使用mina作为网络框架
- Centos6部署lamp: httpd2.4+module模式
- Centos6部署lamp: httpd2.2+module模式
- Android开发中网络请求的压缩 ── GZip的使用
- 关于Xutils框架出现无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase解决方案
- Android VideoView加载网络视频过程中退出页面,出现程序无响应 希望来大神指点一二