Android Okhttp+Retrofit2.0+RxJava简单解析

前言:

今天的重点就是来介绍一下Retyofit2.0的使用方式, retrofit是由square公司开发的。square在github上发布了很多优秀的Android开源项目。例如:otto(事件总线),leakcanary(排查内存泄露),android-times-square(日历控件),dagger(依赖注入),picasso(异步加载图片),okhttp(网络请求),retrofit(网络请求)等等。更多square上的开源项目我们可以去square的GitHub进行查看。这次就来介绍一下retrofit的一些基本用法。retrofit是REST安卓客户端请求库。使用retrofit可以进行GET,POST,PUT,DELETE等请求方式。下面就来看一下retrofit的基本用法。

Retrofit的使用方式

一 添加Gradle依赖项

compile 'com.squareup.retrofit2:retrofit:2.3.0'

二Retrofit

简单三步就可以实现Retrofit2.0异步的操作,如图所示

这里写图片描述

2.1:创建API接口

在retrofit中通过一个Java接口作为http请求的api接口。关于注解这一块后期会分析,今天就先简单的介绍一下get post和上传文件的时候所使用到的注解,如何定义API接口。

  • get的请求方式
public interface GitHubApi {

    @GET("repos/{owner}/{repo}/contributors")
 //使用注解path来定义两个String类型参数     Call<ResponseBody>contributorsBySimpleGetCall(@Path("owner") String owner, @Path("repo") String repo);
}

关于get请求方式的API接口中使用的注解还可以用@Query,@QueryMap来表示

@GET("search/repositories")
Call<RetrofitBean> queryRetrofitByGetCall(@Query("q")String owner,
                                      @Query("since")String time,
                                      @Query("page")int page,
                                      @Query("per_page")int per_Page);

 当我们的参数过多的时候我们可以通过@QueryMap注解和map对象参数来指定每个表单项的Key,value的值。

@GET("search/repositories")
Call<RetrofitBean> queryRetrofitByGetCallMap(@QueryMap Map<String,String> map);

在Retrofit 2.0添加了一个新的注解:@Url,它允许我们直接传入一个请求的URL。这样以来我们可以将上一个请求的获得的url直接传入进来。方便了我们的操作。

@GET
Call<List<Contributor>> repoContributorsPaginate(@Url String url);
  • post的请求方式

     我们可以使用@FormUrlEncoded注解来发送表单数据。使用 @Field注解和参数来指定每个表单项的Key,value为参数的值。

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

当我们有很多个表单参数时可以通过@FieldMap注解和Map对象参数来指定每个表单项的Key,value的值。

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@FieldMap Map<String,String> fieldMap);
  • 发送文件

通过@Multipart注解来发送Multipart数据。通过@Part注解来定义需要发送的文件。

@Multipart
@PUT("/user/photo")
User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);
  • 请求头部的定义
//请求头
    @Headers({
            "Accept: application/vnd.github.v3.full+json",
            "User-Agent: RetrofitBean-Sample-App",
            "name:liangguliang"
    })

2.2:创建Retrofit

最基本的初始化

 Retrofit retrofit=new Retrofit.Builder().baseUrl("https://api.github.com/").build();

创建retrofit实例,我们通也过addConverterFactory指定一个factory来对响应反序列化,在这里converters被添加的顺序将是它们被Retrofit尝试的顺序。

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

2.3:实例化API接口

GitHubApi repo = retrofit.create(GitHubApi.class);
Call<List<Contributor>> call = repo.contributorsByAddConverterGetCall(mUserName, mRepo);

2.4:通过接口实现异步请求

call.enqueue(new Callback<List<Contributor>>() {
    @Override
    public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) {
        List<Contributor> contributorList = response.body();
        for (Contributor contributor : contributorList){
            Log.d("login", contributor.getLogin());
            Log.d("contributions", contributor.getContributions() + "");
        }
    }

    @Override
    public void onFailure(Call<List<Contributor>> call, Throwable t) {

    }
});

Retroft的使用是不是挺简单的~

三 Okhttp+Retrofit2.0

okHttp+Retrofit2.0实现异步操作的方式单独使用Retrofit多了一个设置client()的方法

这里写图片描述

创建OkhttpClient来设置时间间隔,增加日志信息,设置缓存等

设置超时时间如图所示

  //手动创建一个OkHttpClient并设置超时时间
        okhttp3.OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(5, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder()
                .client(builder.build())              .addConverterFactory(GsonConverterFactory.create())               .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl("http://www.izaodao.com/Api/")
.build();

 在retrofit2.0中是没有日志功能的。但是retrofit2.0中依赖OkHttp,所以也就能够通过OkHttp中的interceptor来实现实际的底层的请求和响应日志。在这里我们需要修改上一个retrofit实例,为其自定自定义的OkHttpClient。代码如下:

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .addInterceptor(httpLoggingInterceptor)
        .build();

Retrofit retrofit = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .client(okHttpClient)
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

好了,Retrofit2.0的使用是不是简化了很多~就单独的来说,OkHttp的网络请求也是很好用的,之前写过一篇介绍Okhttp的简单用法,http://blog.csdn.net/qq_31927865/article/details/77506972推荐文章鸿神的http://blog.csdn.net/lmj623565791/article/details/47911083

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值