Android学习笔记之Retrofit2的使用

来源:互联网 发布:python会取代java么 编辑:程序博客网 时间:2024/05/21 08:51

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

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

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

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

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

一、创建Service接口类

1、创建Apiservice接口类

//起什么名字随意 但通常xxService 或 xxApipublic 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<MovieData> 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<MovieDataBean> call);
  • 其中encoded默认为false,如果你不需要就不要写;
  • 也可以将响应的回调直接当成参数,在调用接口的时候可以以内部类的形式实现,当然我不建议将回调放到这里,毕竟retrofit要和Rxjava一起用才能最大化的体现出它的优越性;
  • @QueryMap 可以和@Query 同时使用,他们是将参数直接拼接到url后面。

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

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

再来一段实例代码

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

四、接口调用

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

public void getDatas(int start, int count){        apiService.getMovieTest(start, count)                .enqueue(new Callback<MovieDataBean>() {                    @Override                    public void onResponse(Call<MovieDataBean> call, Response<MovieDataBean> response) {                    //在这里请求成功的操作                    }                    @Override                    public void onFailure(Call<MovieDataBean> 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<HttpResult<List<NoticeResponse>>> getNotice(@Field("pageNo") int pageNo);

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

4、调用接口

public void getTopMovie(Subscriber<MovieDataBean> 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"