Android学习笔记之Retrofit2的使用

本文为笔者的学习笔记,为了方便自己复习和查阅;内容将随着学习和使用随时更新。

Retrofit官方使用文档点这里。
注意:

  • Retrofit2与Retrofit1存在Api的差异,他们是不通用的;
  • 本文暂只记录Retrofit的使用,不探究其原理与运行流程。

要完成一个完整的Retrofit的请求我们大致需要以下步骤(暂定):

  1. 创建Service接口类
  2. 创建Retrofit和Service对象
  3. 在Service类里创建我们的请求接口
  4. 调用接口处理响应结果
  5. Retrofit2结合RxJava的使用

一、创建Service接口类

1、创建Apiservice接口类

//起什么名字随意 但通常xxService 或 xxApi
public interface MovieService{
//这里写具体的请求接口
}

没啥说的就这样。

二、创建Retrofit对象和service对象

1、创建Retrofit对象
先来一段纯天然,无添加的retrofit

 retrofit = new Retrofit.Builder()
                //设置请求的主机地址 必须以"/"结尾
                .baseUrl(BASE_URL)
                //设置OkHttpClient 可以配置一些参数(如果你不设置他也会有默认的)
                .client(client.build())
                //Gson转换器工厂 
                .addConverterFactory(GsonConverterFactory.create())
                .build();

通常的在实际项目中你可以通过client来配置一些参数

OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.connectTimeout(10000, TimeUnit.MILLISECONDS);
        client.writeTimeout(10000, TimeUnit.MILLISECONDS);
        client.readTimeout(10000, TimeUnit.MILLISECONDS);

        if (App.DEBUG) {
        //设置拦截器 
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
            //方便我们调试接口
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
            client.addInterceptor(interceptor);
        }

2、创建service对象
上例所示MovieService是一个接口

//源码中这里返回时 设置了动态代理 //Proxy.newProxyInstance(service.getClassLoader(), new Class[] { //service },new InvocationHandler(){})
//在我们正式调用接口是 会进入new InvocationHandler(){}来实现的(这里暂时不说源码里的东西)
apiService = retrofit.create(MovieService.class);

至此我们第二步就完成了。

三、创建需要请求的接口

1、 GET请求

先来一段Get请求的基本套路:

@GET("path")
Call<响应实体> getMovieData(@Query("字段") 参数类型  参数名称);

下面来一段实例代码:

@GET"v2/movie/top250")
Call getMovieData(@Query("page") int page,@Query("count") int count);

简单说明一下(感觉没啥好说的^~^):
- @Get这个注解表示这个请求是一个get请求(这不是废话么。。);
- @Get(“v2/movie/top250”)这其中的“v2/movie/top250”即为path了,就是所谓的资源访问路径;
- Call< T > 我们通常用它来处理响应的回调,T:表示响应实体的类型;
- @Query(“page”) int page:这个就是你请求的参数了;

很显然上面的实例代码并不是实现Get请求的唯一套路,你可以这样写:

@GET"v2/movie/top250")
void getMovieData(@QueryMap(encoded = true) Map<String,Integer> params, Call call);
  • 其中encoded默认为false,如果你不需要就不要写;
  • 也可以将响应的回调直接当成参数,在调用接口的时候可以以内部类的形式实现,当然我不建议将回调放到这里,毕竟retrofit要和Rxjava一起用才能最大化的体现出它的优越性;
  • @QueryMap 可以和@Query 同时使用,他们是将参数直接拼接到url后面。

2、POST请求
同样的我们先来一个post请求的基本套路

@FormUrlEncoded
@POST("path")
Call getNotice(@Filed("参数1") 参数类型 参数名称);

再来一段实例代码

@FormUrlEncoded
@POST("api/v1/notice")
Call> getNotice(@Filed("pageNo") int pageNo);
  • 有参数时需要加上@ForUrlEncoded注解,没有参数一定不要添加此注解;
  • 如果我们有较多的参数,我们也可以使用@FiledMap代替@Filed;
  • @FiledMap和@Filed是将请求参数放到请求体里。

四、接口调用

在我们需要调用接口的地方需要

public void getDatas(int start, int count){
        apiService.getMovieTest(start, count)
                .enqueue(new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                    //在这里请求成功的操作

                    }

                    @Override
                    public void onFailure(Call call, Throwable t) {
                    //在这里请求失败的操作

                    }
                });
    }

至此使用Retrofit2的基本请求功能以实现。

五、Retrofit2+Rxjava构建网络请求

如果咱们用了Retrofit2却不使用Rxjava,那么和咸鱼有什么区别
1、创建Service接口类和前面没有区别;
2、 创建Retrofit对象和Service对象;

retrofit = new Retrofit.Builder()
                .client(client.build())
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()) 
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        apiService = retrofit.create(MovieService.class);

使用了RxJava的CallAdapterFactory,它将我们的返回的数据进行适配转换处理。
3、创建接口

@FormUrlEncoded
    @POST("api/v1/notice")
    Observable>> getNotice(@Field("pageNo") int pageNo);

返回值类型有Call< T > 换成Observable< T >。

4、调用接口

public void getTopMovie(Subscriber subscriber, int start, int count) {
        apiService.getMovieDatas(start, count)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);
    }

subscriber为观察者,在这里处理响应结果。

    class MovieSubscribe extends Subscriber<MovieDataBean> {

        @Override
        public void onCompleted() {
            //请求完成
        }

        @Override
        public void onError(Throwable e) {
            //请求出错在这里处理
        }

        @Override
        public void onNext(MovieDataBean movieDataBean) {
          //在这里处理响应成功的结果
          mMovieData.setText(movieDataBean.getSubjects().toString());
        }
    }

这样Retrofit2+RxJava构建的网络请求就完成了。

最后

    compile "io.reactivex:rxjava:1.1.6"
    compile "io.reactivex:rxandroid:1.2.1"

    compile "com.squareup.retrofit2:retrofit:2.1.0"
    compile "com.squareup.retrofit2:converter-gson:2.1.0"
    compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"

你可能感兴趣的:(android学习笔记)