本文为笔者的学习笔记,为了方便自己复习和查阅;内容将随着学习和使用随时更新。
Retrofit官方使用文档点这里。
注意:
1、创建Apiservice接口类
//起什么名字随意 但通常xxService 或 xxApi
public interface MovieService{
//这里写具体的请求接口
}
没啥说的就这样。
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);
2、POST请求
同样的我们先来一个post请求的基本套路
@FormUrlEncoded
@POST("path")
Call getNotice(@Filed("参数1") 参数类型 参数名称) ;
再来一段实例代码
@FormUrlEncoded
@POST("api/v1/notice")
Call> getNotice(@Filed("pageNo") int pageNo)
;
在我们需要调用接口的地方需要
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,那么和咸鱼有什么区别
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"