Retrofit2源码解析(一)

来源:互联网 发布:动画演示制作软件 编辑:程序博客网 时间:2024/05/21 11:42

一、简介

Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码OkHttp Github。在解析源码前先了解retrofit如何使用吧。

二、Retrofit的使用

配置:

  • 添加Retrofit依赖: compile 'com.squareup.retrofit2:retrofit:2.0.2'
  • 添加数据解析依赖:compile 'com.squareup.retrofit2:converter-gson:2.0.2'


使用步骤:

  

  1. 创建JsonBean(可以用工具生成)
  2. 把Http Api 转化为 java interface

   
/**
 * 对应Http接口的Java Interface类
 */
public interface HttpApi {
    @GET("videoHome")
    Call<HomeResponse> getData();
    //GET请求方式,请求Url
    @GET("home")
    Call<HomeResponse> getHomeData();
    /*GET 有参数请求:
        1、可以在url后面直接进行参数拼接,比如    @GET("home?key=value&key2=value2")
        2、可以用@Query进行参数设置,可以有多个
        3、可以用@QueryMap进行参数设置用Map集合进行参数
        */
    @GET("home")
    Call<HomeReponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);
    @GET("home")
    Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);
    /*POST 有参数请求:
     1、可以用@Field进行参数设置,可以有多个
     2、可以用@FieldMap进行参数设置用Map集合进行参数
     3、@FormUrlEncoded注解不可少
     */
    @FormUrlEncoded
    @POST("search")
    Call<HomeResponse> search(
            @Field("keyword") String keyword,
            @Field("page") String page,
            @Field("pageNum") String pageNum,
            @Field("orderby") String orderby
    );
    @FormUrlEncoded
    @POST("search")
    Call<HomeResponse> search(
            @FieldMap Map<String, String> params
    );
}

3.创建Retrofit对象, 并发起请求.示例代码:

 //3.1创建Retrofit实例,进行接口实现

        retrofit = new Retrofit

                .Builder()

                .baseUrl(baseUrl)

                .addConverterFactory(GsonConverterFactory.create())

                .build();

//3.2 实例化接口类

        HomeApi homeApi = retrofit.create(HomeApi.class);

        //3.3 调用接口的方法得到Call

        Call<HomeResponse> homeResponseCall = homeApi.getHomeData();

        //3.4 执行数据的请求操作,可以用同步或者是异步的操作

        //3.4.1 同步操作,耗时操作需要在线程中执行

        /*try {

            Response<HomeResponse> homeResponseResponse = homeResponseCall.execute();

            HomeResponse homeResponse = homeResponseResponse.body();

        } catch (IOException e) {

            e.printStackTrace();

        }*/

        //3.4.2 异步的操作,与okhttp的异步执行不同的是,可以在回掉的方法中进行UI的控制操作

        homeResponseCall.enqueue(new Callback<HomeResponse>() {

            @Override

            public void onResponse(Call<HomeResponse> call, Response<HomeResponse> response) {

                HomeResponse homeResponse = response.body();

                textView.setText(homeResponse.toString());

                textView.setTextColor(Color.GREEN);

            }

            @Override

            public void onFailure(Call<HomeResponse> call, Throwable t) {

                textView.setText(t.getMessage());

                textView.setTextColor(Color.RED);

            }

        });

常用注解:

请求方法:@GET / @POST / @PUT / @DELETE / @HEAD

URL处理

1、拼接注意,建议baseUrl用“/”结尾,接口中url不用"/"开头

例子:baseUrl=http://10.0.2.2:8080/market/        url=home

错误案例

案例一:

baseUrl=http://10.0.2.2:8080/market        url=home

--->http://10.0.2.2:8080/home

分析:默认用最后一个斜线去拼接

案例二:

baseUrl=http://10.0.2.2:8080/market        url=/home

--->http://10.0.2.2:8080/home

分析:url中开始的斜线代表主机地址http://10.0.2.2:8080

2、注解:

@Path - 替换参数

@GET("{path1}/{path2}")//注意:如果路径用“/”分割,就需要使用多个参数表示

public Call<ResponseData> groupList(@Path("path1") String path1,@Path("path2") String path2);

@Query - 添加查询参数,在GET请求中使用

 @GET("home")

 Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);

@QueryMap - 如果有多个查询参数,把它们放在Map中,在GET请求中使用

 @GET("home")

 Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);

@FormUrlEncoded 编码控制 与Post请求结合使用,不能缺少。

 @FormUrlEncoded

 @POST("search")

 Call<SearchResponse> search(

         @Field("keyword") String keyword,

         @Field("page") String page,

         @Field("pageNum") String pageNum,

         @Field("orderby") String orderby

 );

 @FormUrlEncoded

 @POST("search")

 Call<SearchResponse> search(<pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 14px;">@FieldMap Map<String, String> params

         @FieldMap Map<String, String> params

 );

本章retrofit的基本用法就介绍到这里,总的来说retrofit使用起来还是很方便的,而且可以一步到位,直接拿到解析的javabean,省去了我们拿json字符串

去解析的工作,下章重点根据retrofit.enque方法这条访问网络的主线去解析retrofit的底层源码。因为第一次写,写的可能不是不太好,但还是希望能帮

没有使用过但想了解retrofit的朋友,有错误的和表达不准确的地方还请大家多多留言指正。




0 0