//获取豆瓣Top250 榜单
@GET(“top250”)
Call getTop250 (@Query(“start”) int start , @Query(“count”) int count);
@FormUrlEncoded
@POST(“top250”)
Call getTop250 (@Field(“start”) int start , @Field(“count”) int count);
}
使用 POST 方式时需要注意两点:
-
必须加上 @FormUrlEncoded标签,否则会抛异常。
-
必须要有参数,否则会抛异常, 源码抛异常的地方如下:
if (isFormEncoded && !gotField) {
throw methodError(“Form-encoded method must contain at least one @Field.”);
}
4.用 Retrofit 创建 接口实例 MoiveService 并且调用接口中的方法进行网络请求:
异步方式请求:
//获取接口实例
MovieService movieService = retrofit.create(MovieService.class);
//调用方法得到一个Call
Call call = movieService.getTop250(0,20);
//进行网络请求
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
mMovieAdapter.setMovies(response.body().subjects);
mMovieAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call call, Throwable t) {
t.printStackTrace();
}
});
同步方式请求: 返回一个Response
Response response = call.execute();
二,配合RxJava 使用:
- 更改定义的接口,返回值不再是一个 Call ,而是返回的一个 Observble:
public interface MovieService {
//获取豆瓣Top250 榜单
@GET(“top250”)
Observable getTop250(@Query(“start”) int start, @Query(“count”)int count);
}
2.创建 Retrofit 的时候添加如下代码:
addCallAdapterFactory(RxJava2CallAdapterFactory.create())
3.添加转换器Converter(将 json 转为 JavaBean):
addConverterFactory(GsonConverterFactory.create())
举实际项目中使用的例子:
retrofit = new Retrofit.Builder()
.client(okHttpBuilder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
4.Activity 或者 Fragment 中传入 DisposableObserver 建立订阅关系:
Subscription subscription = movieService.getTop250(0,20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver() {
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MovieSubject movieSubject) {
mMovieAdapter.setMovies(movieSubject.subjects);
mMovieAdapter.notifyDataSetChanged();
}
});
5.加入RxJava的好处:
-
加入 RxJava 后的网络请求,返回不再是一个 Call ,而是一个 Observable。
-
在Activity / Fragment 中传入一个Subscriber 建立订阅关系,就可以在 onNext 中处理结果了。
-
RxJava 的好处是帮我处理 线程之间的切换,我们可以在指定 订阅的在哪个线程,观察在哪个线程。
-
可以 通过操作符 进行数据变换。
-
整个过程都是链式的,简化逻辑。其中FlatMap 操作符 还可以解除多层嵌套的问题。
RxJava 很强大,能帮我处理很多复杂的场景,如果熟练使用的话,那么能提升我们的开发效率。
三,加入 OkHttp 配置:
通过OkHttpClient 可以配置很多东西,比如 链接超时时间,缓存,拦截器 等等。代码如下:
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//连接 超时时间
builder.writeTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS);//写操作 超时时间
builder.readTimeout(DEFAULT_TIME_OUT,TimeUnit.SECONDS);//读操作 超时时间
builder.retryOnConnectionFailure(true);//错误重连
// 添加公共参数拦截器
BasicParamsInterceptor basicParamsInterceptor = new BasicParamsInterceptor.Builder()
.addHeaderParam(“userName”,“”)//添加公共参数
.addHeaderParam(“device”,“”)
.build();
builder.addInterceptor(basicParamsInterceptor);
// 创建Retrofit
mRetrofit = new Re