Retrofit从源码解读基本用法
核心内容
- Retrofit2.0之后的版本使用
- Retrofit的常用功能
详细介绍
- 最简单的使用
//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
//设定网络请求根接口,注意接口的规则已“/”结束
.baseUrl("https://api.example.com/")
//设置Gson解析
.addConverterFactory(GsonConverterFactory.create())
.build();
//自定义的网络请求设置(主要是网络请求方法、传值)
MyApi api = retrofit.create(MyApi.class);
//获取根据接口返回的数据
User user = api.getUser().execute();
-
普通用法需要注意的问题
- BaseUrl设置要特别注意baseUrl的结束“/”,一般推荐直接在baseUrl中添加,这也是平时些接口数据的习惯,因为这样可以在每个后续的拼接链接路径中都少写一个“/”,同时该类提供的Endpoint会很方便的添加到末尾
- MyApi的代码其实类似下面这样:
-
public interface MyApi { @GET ("data/福利/{number}/{page}") Observable<GankBeautyResult> loadPage(@Path("number") int number, @Path("page") int page, @Query("q") String query); }
- 而User是用来接受请求返回结果的数据模型,习惯称之为model,通常在AS中安装了GsonFormat插件,直接json数据传递到这个插件工具中就可以直接生成与json对应的数据类型。
- 其中@Path和@Query都是往当前链接中添加字段,但是两者的添加方式不同@Path("number") int number和{number}连用,用number替代{number}的位置;而Query的方法则是直接在链接的后面拼接'/p = query';
- 在解析方面GsonConverterFactory.create(),不是唯一的选择,你也可以选择FastJson
- 而在返回数据方面Retrofit也提供了至少两种的Response#Result处理方式,第一种普通的回调Callback方式,说白了就是借口的方式;另一种则是联合RxJava&RxAndroid使用响应式编程的风格,因为个人偏好于第二种所以下面会给出一个Retrofit+RectiveX的一个例子;
-
Retrofit+RectiveX使用
- 这种用法的跟基本用法的请求方式完全一样,只是在结果的处理方式上有所不同,这里采用的类似于观察者模式的
- 普通的CallBack回调方式的处理结果,通常用的就是interface里面定义方法的方式,设置监听接受结果
- 使用了RxJava和RxAndroid的方式可以借助该框架的强大功能来处理数据,如:控制请求在子线程,UI显示在主线程处理;再如:可以在请求中途对放回的结果进行重组,亦或是在一个接口请求完成的结果发起下一个接口的请求,而且全程都是链条式的结构,一行代码看起来逻辑请求简介.
- 废话少说上代码:
public void request() {
swipeRefreshLayout.setRefreshing(true);
//Create and Configure Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://zhuangbi.info/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//Receiver response
Observer<List<ZhuangBiImage>> observer = new Observer<List<ZhuangBiImage>>() {
@Override
public void onCompleted() {
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onError(Throwable e) {
swipeRefreshLayout.setRefreshing(false);
Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(List<ZhuangBiImage> zhuangbiImages) {
recyclerView.setAdapter(new ZhuangBiAdatper(zhuangbiImages));
}
};
//Send request and Configure network params
NetWorkInterface netWorkInterface = retrofit.create(NetWorkInterface.class);
subscription = netWorkInterface.search("装逼")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
总结
- 上面的代码很简单,初步接触Retrofit的使用已经够用了,但是想发挥它更强大的功能可以在看看RectiveX相关的知识,这些知识资料也在博客中已经整理好了,可移步到这里查看:http://blog.csdn.net/dnnis/article/details/52160503
- 这里只介绍了入门使用,更深层次的使用以后如果在项目中应用良好在补充吧。