您的位置:首页 > 理论基础 > 计算机网络

封装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() {

            }

        });

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: