美文网首页
Android retrofit的简单封装

Android retrofit的简单封装

作者: cvmars | 来源:发表于2017-02-19 13:50 被阅读177次

本文的项目地址

1.Retrofit是基于OkHttp网络请求框架的二次封装而已,懂Okhttp的小伙伴,那么Retrofit也就基本都会。
2.Retrofit采用注解配置请求的方式:
3.性能最好,处理最快
4.使用REST API时非常方便;
5.传输层默认就使用OkHttp;
6.支持NIO;
7.拥有出色的API文档和社区支持
8.速度上比volley更快;
9.如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。
10.默认使用Gson

一:retrofit的使用

Retrofit支持同步和异步两种方式,在使用时,需要将请求地址转换为接口,通过注解来指定请求方法,请求参数,请求头,返回值等信息。get请求到服务器后从数据库查询数据,返回值为查询到的数据,post请求向服务器提交一条数据,返回值为提交的数据。

一:首先完成请求所用的service,是一个interface,完全通过注解完成配置。

倚赖需要的包

   compile 'com.squareup.retrofit2:retrofit:2.1.0'
   compile 'com.google.code.gson:gson:2.8.0'

public interface DouBanApiClient {

    /**
     *@param headers  请求参数头
     *@param url   请求的地址
     *@param params 请求的参数
     */
    @GET()
    Call<ResponseBody> get(@HeaderMap Map<String, String> headers, @Url String url, @QueryMap Map<String, String> params);

    @FormUrlEncoded
    @POST()
    Call<String> post(@HeaderMap Map<String, String> headers, @Url String url, @FieldMap Map<String, String> params);

    @Streaming
    @GET()
    Call<ResponseBody> download(@HeaderMap Map<String, String> headers, @Url String url, @QueryMap Map<String, String> params);
}

二:创建一个请求单例 ApiClient,方便管理网络请求,本文只给出get请求的实现方式。

(ApiBuilder 构建的参数 包含 请求 url header params,后文会贴出代码)

/**
 *
 * 网络请求类
 * Created by Administrator on 2017/2/13 0013.
 */

public class ApiClient {

    static ApiClient instance;


    public final static  String BASE_API = "http://app.youxiake.com";

    /**
     * 请求的接口
     * */
    public static String Api_BookInfo = "/api/discover/list/hot";


    /***
     *
     * 构建 retrofit请求
     * */
    private final static Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(ApiClient.BASE_API)
            .build();


    /**
     * 获得 DouBanApiClient实例
     * @return
     */
    public DouBanApiClient getDbService(){

        return retrofit.create(DouBanApiClient.class);
    }

    /**
     * 创建请求单例
     * @return
     */
    public static ApiClient getInstance(){

        if(instance == null){
            synchronized (ApiClient.class){
                if(instance ==null){
                    instance = new ApiClient();
                }
            }
        }
        return instance;
    }



    /**
     *
     * get请求
     * @param builder  request构建的参数 包含 url header params
     * @param onCallback  rquest 回调
     * @param classOf   指定请求的model类型
     * @param <T>
     */
    public <T> void doGet(ApiBuilder builder ,final com.retrofitdemo.interfaces.CallBack<T> onCallback,final Class classOf){

        DouBanApiClient dbService = getDbService();
        Call<ResponseBody> stringCall = dbService.get(checkHeaders(builder.headers),
                checkUrl(builder.url), checkParams(builder.params));

        stringCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

                Object o = null;
                try {
                    Log.d("TAG","----"+response.body().string());
                    o = new Gson().fromJson(response.body().string(), classOf);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                onCallback.onSuccess(call, (T) o);
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                onCallback.onFailure(call,t);
                Log.d("TAG","----"+t.getMessage());
            }
        });
    }



    private String checkUrl(String url) {
        if (checkNULL(url)) {

            return null;
        }
        return url;
    }
    // 判断是否NULL
    public static boolean checkNULL(String str) {
        return str == null || "null".equals(str) || "".equals(str);

    }

    // 判断是否NULL
    public static void Error(Context context, String msg) {
        if (checkNULL(msg)) {
            msg = "未知异常";
        }
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }

    public static Map<String, String> checkHeaders(Map<String, String> headers) {
        if (headers == null) {
            headers = new HashMap<>();
        }
        //retrofit的headers的值不能为null,此处做下校验,防止出错
        for (Map.Entry<String, String> entry : headers.entrySet()) {
            if (entry.getValue() == null) {
                headers.put(entry.getKey(), "");
            }
        }
        return headers;
    }

    public static Map<String, String> checkParams(Map<String, String> params) {
        if (params == null) {
            params = new HashMap<>();
        }
        //retrofit的params的值不能为null,此处做下校验,防止出错
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (entry.getValue() == null) {
                params.put(entry.getKey(), "");
            }
        }
        return params;
    }
}

三:构建请求的参数

/**
 * Created by cvmars 2017/2/14 0014.
 */

public class ApiBuilder {

    Map<String, String> params ;
    Map<String, String> headers ;
    String url;

    public ApiBuilder Params(Map<String, String> params) {
        this.params.putAll(params);
        return this;
    }

    public ApiBuilder Params(String key, String value) {
        this.params.put(key, value);
        return this;
    }

    public ApiBuilder Headers(Map<String, String> headers) {
        this.headers.putAll(headers);
        return this;
    }

    public ApiBuilder Headers(String key, String value) {
        this.headers.put(key, value);
        return this;
    }

    public ApiBuilder Url(String url) {
        this.url = url;
        return this;
    }

    public ApiBuilder(String url) {
        this.setParams(url);
    }

    public ApiBuilder() {
        this.setParams(null);
    }


    private void setParams(String url) {
        this.url = url;
        this.params = new HashMap<>();
        this.headers = new HashMap<>();
    }
}

四:回调接口

public interface CallBack<T> {

    void onSuccess(Call<ResponseBody> call, T response);

    void onFailure(Call<ResponseBody> call, Throwable t);
}
五:简单的封装基本完成:下面是基本使用方法

先创建返回的model

public class FindContent {

    
    public String msg;
    public int code;

    public DataBean data;

    public static class DataBean {
        public int total;
        public int totalPage;
        public int pageSize;

        public List<QuotesListBean> quotesList;

        public static class QuotesListBean {
            public String content;
            public String uid;
            public String address;
            public String show_address;
            public String comment;
            public String prise;
            public String gmt_create;
            public String type;
            public String video;
            public Object activity;
            public String username;
            public String avatar;
            public int quote_id;
            public String relation;
            public String share_url;
            public boolean prised;
            public List<ImagesBean> images;
            public List<?> discus;

            public static class ImagesBean {
                public String width;
                public String height;
                public String url;
                public String url_xl;
                public String url_l;
                public String url_m;
                public List<?> labels_info;
            }
        }
    }
}

在需要请求的地方进行调用


    ApiBuilder builder = new ApiBuilder(ApiClient.Api_BookInfo)
                .Headers("header1","this is request header")
                .Headers("header2","this is request header2")
                .Params("params","this is request params");
        ApiClient.getInstance().doGet(builder, new CallBack<FindContent>() {
            @Override
            public void onSuccess(Call<ResponseBody> call, FindContent response) {

                mContent.setText(response.toString());
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {


            }
        },FindContent.class);
    }

本文的项目地址

相关文章

网友评论

      本文标题:Android retrofit的简单封装

      本文链接:https://www.haomeiwen.com/subject/flkjwttx.html