随着网络请求的方式不同,所以封装的也不同,我简单的举例3种
首先要导依赖包:
compile 'com.squareup.okhttp3:okhttp:3.9.0'
private OkHttpClient client;
1.get请求:
//get网络请求 public <T> void doGet(String url, Map<String, String> params, final Class<T> clazz) { client = new OkHttpClient.Builder() .build(); Request.Builder builder = new Request.Builder(); // headers.putAll(params); //第一种遍历map集合的方式 StringBuffer buffer = new StringBuffer(); for (Map.Entry<String, String> entry : params.entrySet()) { buffer.append(entry.getKey() + "=" + entry.getValue() + "&"); } builder.url(url+"?" + buffer); Request request = builder.build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.e("aaa", response.toString()); //判断是否有数据 if (response.isSuccessful()) { String value = response.body().string(); T t = new Gson().fromJson(value, clazz); //将数据传到handler里面 Message msg = handler.obtainMessage(); msg.obj = t; handler.sendMessage(msg); } } }); }
接口参数比较多的话,利用map拼接来实现,
url写的就是一些固定的接口,
map就是拼接
class就是写的bean类,这里还用了泛型
我们通过response.body().string();
获取到所有的数据
由于是异步解析,所以得用handler传数据
//Handler发送消息 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { T t = (T) msg.obj; // P_M.onSuccess(t); } };
这里面的t也就拿到了请求后的所有数据,
我们只需要把T强转成我们想用的bean类就好了!
在做项目的时候,登录注册都是使用post请求:
所以接下来就是post请求
2.post请求
//post网络请求 public void doPost(String url, Map<String, String> parmas, final Class<T> clazz) { client = new OkHttpClient.Builder() .build(); FormBody.Builder builder = new FormBody.Builder(); // headers.putAll(parmas); for (Map.Entry<String, String> entry : parmas.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } RequestBody formbody = builder.build(); Request request = new Request.Builder() .url(url) .post(formbody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String result = response.body().string(); T t = new Gson().fromJson(result, clazz); Message msg = handler.obtainMessage(); msg.obj = t; handler.sendMessage(msg); } } }); }
post 和get差不多
3.简单不拼接的get请求
public void doVideoHotget(String url, final Class<T> clazz) { client = new OkHttpClient.Builder() .build(); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String result = response.body().string(); T t = new Gson().fromJson(result, clazz); Message msg = handler.obtainMessage(); msg.obj = t; handler.sendMessage(msg); } } }); }这个就比较简单,我们只需要传一个URL还有需要的bean类就好了,
省略了拼接的过程
注意的就是,必须要使用handler,因为是异步加载数据,
尽量不要用同步加载,因为同步加载,可能会出现ANR异常,也就是
应用无响应。所以还是用异步加载数据比较好!
希望这个封装能对初学者有帮助
最主要的就是不要忘记写网络权限