Android学习笔记之Retrofit2的使用
来源:互联网 发布:python会取代java么 编辑:程序博客网 时间:2024/05/21 08:51
本文为笔者的学习笔记,为了方便自己复习和查阅;内容将随着学习和使用随时更新。
Retrofit官方使用文档点这里。
注意:
- Retrofit2与Retrofit1存在Api的差异,他们是不通用的;
- 本文暂只记录Retrofit的使用,不探究其原理与运行流程。
要完成一个完整的Retrofit的请求我们大致需要以下步骤(暂定):
- 创建Service接口类
- 创建Retrofit和Service对象
- 在Service类里创建我们的请求接口
- 调用接口处理响应结果
- 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"
- Android学习笔记之Retrofit2的使用
- Retrofit2的学习笔记
- Android Retrofit2的使用
- Android Retrofit2.0 学习笔记
- Android框架学习之Retrofit(二)RxJava和Retrofit2.0的结合使用
- 学习笔记——Retrofit2.0的简单使用
- Android学习之网络请求库Retrofit2
- Retrofit2.1.0 学习笔记
- retrofit2学习笔记
- Retrofit2学习笔记-1
- retrofit2.3.0 学习笔记
- RxJava前奏之Retrofit2.0的学习
- android retrofit2.0框架的使用介绍
- android学习笔记——Retrofit2.0学习
- android学习笔记之ProgressDialog的使用
- android学习笔记之RadioGroup的使用
- Android学习之笔记---WebView的使用
- Android学习之笔记---Animation的使用
- 常见的http请求头和响应头
- WINPCAP源码阅读
- bzoj1022 [SHOI2008]小约翰的游戏John
- Python学习之延时回调普通函数详解
- bzoj1026 [SCOI2009]windy数
- Android学习笔记之Retrofit2的使用
- bzoj1257 [CQOI2007]余数之和sum
- OpenGL+MFC对三维点云的法向量实现可视化
- bzoj1303 [CQOI2009]中位数图
- bzoj2460 [BeiJing2011]元素
- 刷了两遍LeetCode之后,我拿了9个offer
- (七)Working with System Permissions使用系统权限
- 如何在Listview中拖拽其中的子Item移动其位置
- bzoj2463 [中山市选2009]谁能赢呢?