简单的封装Okhttp

随着网络请求的方式不同,所以封装的也不同,我简单的举例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异常,也就是

应用无响应。所以还是用异步加载数据比较好!

希望这个封装能对初学者有帮助

最主要的就是不要忘记写网络权限

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/nyb521/article/details/78351061
今日推荐