一个简单明了的OKhttp封装类

本篇博客Demo:http://download.csdn.net/download/g_ying_jie/10134576

单例化工具类,获取主线程handle回调结果

public class OkHttpUtil {

    private Handler handler;
    private OkHttpClient client;


    private OkHttpUtil() {
        client = new OkHttpClient();
        client.setConnectTimeout(30, TimeUnit.SECONDS);

        handler = new Handler(Looper.getMainLooper());
    }

    private static class SingleHolder {
        public static final OkHttpUtil instance = new OkHttpUtil();
    }

    public static OkHttpUtil getInstance() {
        return SingleHolder.instance;
    }
}

Get请求、没有请求参数形式

/**
     * 异步线程访问网络
     * get请求
     */
    public void get(String url, final HttpCallBack httpCallBack) {
        Request request = new Request.Builder()
                .url(url)
                .build();
        enqueue(request, httpCallBack);
    }


Get请求,带参数请求

/**
     * 异步线程访问网络
     * get请求 带Body请求体
     */
    public void get(String url, HashMap maps, final HttpCallBack httpCallBack) {
        StringBuffer urlBuffer = new StringBuffer(url);
        Iterator iterator = maps.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            urlBuffer.append((String) entry.getKey()).append("=").append((String) entry.getValue()).append("&");
        }
        urlBuffer.deleteCharAt(urlBuffer.length() - 1);
        Request request = new Request.Builder()
                .url(urlBuffer.toString())
                .build();
        enqueue(request, httpCallBack);
    }

Post请求 键值对数据体

/**
     * 异步线程访问网络
     * post请求 键值对数据体
     */
    public void post(String url, HashMap maps, final HttpCallBack httpCallBack) {
        FormEncodingBuilder formBuilder = new FormEncodingBuilder();
        Iterator iterator = maps.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            formBuilder.add((String) entry.getKey(), (String) entry.getValue());
        }
        Request request = new Request.Builder()
                .url(url)
                .post(formBuilder.build())
                .build();

        enqueue(request, httpCallBack);
    }

Post请求 Json数据体

/**
     * 异步线程访问网络
     * post请求 Json数据体
     */
    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

    public void post(String url, String json, final HttpCallBack httpCallBack) {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();

        enqueue(request, httpCallBack);
    }

Post方式上传文件

     /**
     * Post方式提交文件
     */
    private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");

    public void postFile(File file, String path, final HttpCallBack httpCallBack) {
        final Request request = new Request.Builder()
                .url(path)
                .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
                .build();
        enqueue(request, httpCallBack);
    }

@文件下载

/**
     * 异步下载文件
     * @param url
     * @param destFileDir 本地文件存储的文件夹
     */
    private void downloadFile(final String url, final String destFileDir, final HttpCallBack httpCallBack) {
        final Request request = new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(final Request request, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        httpCallBack.onFailure(request, e);
                    }
                });
            }

            @Override
            public void onResponse(Response response) {
                InputStream is = null;
                FileOutputStream fos = null;
                byte[] buf = new byte[2048];
                int len = 0;
                try {
                    is = response.body().byteStream();
                    final File file = new File(destFileDir, getFileName(url));
                    fos = new FileOutputStream(file);
                    while ((len = is.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                    }
                    fos.flush();
                    //如果下载文件成功,参数为文件的绝对路径
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            httpCallBack.onResponse(file.getAbsolutePath());
                        }
                    });
                } catch (final IOException e) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            httpCallBack.onFailure(request, e);
                        }
                    });
                } finally {
                    try {
                        if (is != null) is.close();
                    } catch (IOException e) {
                    }
                    try {
                        if (fos != null) fos.close();
                    } catch (IOException e) {
                    }
                }

            }
        });
    }

    private String getFileName(String path) {
        int separatorIndex = path.lastIndexOf("/");
        return (separatorIndex < 0) ? path : path.substring(separatorIndex + 1, path.length());
    }

@一些调用的方法和接口(不带Callback的执行即为同步执行)

    private void enqueue(Request re, final HttpCallBack httpCallBack) {
        client.newCall(re).enqueue(new Callback() {
            @Override
            public void onFailure(final Request request, final IOException e) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        httpCallBack.onFailure(request, e);
                    }
                });
            }

            @Override
            public void onResponse(Response response) throws IOException {
                final String result = response.body().string();
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        httpCallBack.onResponse(result);
                    }
                });
            }
        });
    }


    public interface HttpCallBack {
        void onFailure(Request request, IOException e);

        void onResponse(String response);
    }

@Activity中的应用

package com.gu.okhttp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.gu.okhttp.bean.BaseAppEntity;
import com.gu.okhttp.bean.DataBeanEntity;
import com.gu.okhttp.utils.OkHttpUtil;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import java.io.IOException;
import java.lang.reflect.Type;

public class MainActivity extends AppCompatActivity {
    public static final String POST_URL = "http://api/CodeBook/Adviser/Login";
    public static final String Json = "{\"loginname\":\"hahaha\",\"password\":\"123456\"}";

    public static final String GET_URL = "http://api/CodeBook/Book/GetMyBookList?adviser_id=10&name=&order_field=reader_count&sort=1&pageIndex=1&pageSize=10";

    //装载数据
    private BaseAppEntity<DataBeanEntity> entity;
    private Gson gson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gson = new Gson();
    }

    public void onPost(View view) {
        OkHttpUtil.getInstance().post(POST_URL, Json, new OkHttpUtil.HttpCallBack() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(String response) {

            }
        });
    }

    public void onGet(View view) {
        OkHttpUtil.getInstance().get(GET_URL, new OkHttpUtil.HttpCallBack() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(String response) {
                Type type = new TypeToken<BaseAppEntity<DataBeanEntity>>() {
                }.getType();
                entity = gson.fromJson(response, type);
            }
        });
    }

}


这里还可以视项目需求封装一个Javabean的基类,以泛型传入具体的实现类,直接返回数据对象。具体使用可以参考demo。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值