开发资料
最近接触到了Retrofit相关的知识,通过学习,对Retrofit框架的使用有了一定的理解,通过查找资料,我认为下面这一篇文章总结的很好,贴上文章链接。
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)
上面这一篇文章可以作为Retrofit手册使用了,感谢原作者。另外,我参考了另外两篇文章:
结合以上两篇文章,吸取其中的优点,并替换不再支持的url调用,自己动手写了一个demo,现在奉上,以备不时之需能尽快上手。下面是快速使用Retrofit的步骤:
快速上手DEMO
- 步骤说明
步骤1:添加Retrofit库的依赖
步骤2:创建 接收服务器返回数据 的类
步骤3:创建 用于描述网络请求 的接口
步骤4:创建 Retrofit 实例
步骤5:创建 网络请求接口实例 并 配置网络请求参数
步骤6:发送网络请求(采用最常用的异步方式)
封装了 数据转换、线程切换的操作
步骤7: 处理服务器返回的数据
接下来,我们一步步进行讲解。
demo中使用的URL为 http://112.124.22.238:8081/course_api/wares/hot?pageSize=28&curPage=1
准备工作
配置依赖
compile 'com.squareup.okhttp3:okhttp:3.7.0' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0'
创建 接收服务器返回数据的类
package com.xzy.retrofitdemo; import java.util.List; /** * Function:根据返回的json格式构造的bean * Created by xuzhuyun on 2018/1/15. */ public class ShopBean { /** * { * "currentPage": 1, * "list": [ * { * "id": 1, * "imgUrl": "http://7mno4h.com2.z0.glb.qiniucdn.com/s_recommend_55c1e8f7N4b99de71.jpg", * "name": "联想(Lenovo)拯救者14.0英寸游戏本(i7-4720HQ 4G 1T硬盘 GTX960M 2G独显 FHD IPS屏 背光键盘)黑", * "price": 5979.0, * "sale": 8654 * } * ], * "pageSize": 1, * "totalCount": 28, * "totalPage": 28 * } **/ private int currentPage; private int pageSize; private int totalPage; private int totalCount; private List<ListBean> list; public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } /** * id : 1 * name : 联想(Lenovo)拯救者14.0英寸游戏本(i7-4720HQ 4G 1T硬盘 GTX960M 2G独显 FHD IPS屏 背光键盘)黑 * imgUrl : http://7mno4h.com2.z0.glb.qiniucdn.com/s_recommend_55c1e8f7N4b99de71.jpg * description : null * price : 5979.0 * sale : 8654 */ public static class ListBean { private int id; private String imgUrl; private String name; private double price; private Object description; private int sale; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Object getDescription() { return description; } public void setDescription(Object description) { this.description = description; } public int getSale() { return sale; } public void setSale(int sale) { this.sale = sale; } @Override public String toString() { return "ListBean{" + "id=" + id + ", imgUrl='" + imgUrl + '\'' + ", name='" + name + '\'' + ", price=" + price + ", description=" + description + ", sale=" + sale + '}'; } } @Override public String toString() { return "ShopBean{" + "currentPage=" + currentPage + ", pageSize=" + pageSize + ", totalPage=" + totalPage + ", totalCount=" + totalCount + ", list.get(0)=" + list.get(0).toString() + '}'; } }
创建 用于描述网络请求 的接口
package com.xzy.retrofitdemo.service; import com.xzy.retrofitdemo.ShopBean; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Query; /** * Function:访问api的接口 * Created by xuzhuyun on 2018/1/15. */ public interface ShopService { @GET("/course_api/wares/hot") Call<ShopBean> getShop(@Query("pageSize") int pageSize, @Query("curPage") int curPage); }
创建 Retrofit 实例(网络接口服务的包装类)
package com.xzy.retrofitdemo; import android.content.Context; import com.xzy.retrofitdemo.constant.Constant; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; /** * Retrofit 网络接口服务的包装类 * Created by xuzhuyun on 2018/1/15. */ public class RetrofitWrapper { private static RetrofitWrapper instance; private Context mContext; private Retrofit retrofit; private RetrofitWrapper() { //1.创建Retrofit对象 retrofit = new Retrofit.Builder().baseUrl(Constant.BASEURL) // 定义访问的主机地址 .addConverterFactory(GsonConverterFactory.create()) //解析方法 .build(); } /** * 单例模式 * * @return */ public static RetrofitWrapper getInstance() { if (instance == null) { synchronized (RetrofitWrapper.class) { if (instance == null) { instance = new RetrofitWrapper(); } } } return instance; } public <T> T create(final Class<T> service) { return retrofit.create(service); } }
定义访问Model
网络服务的包装类定义好了之后,在定义一个访问的Model
package com.xzy.retrofitdemo.model; import android.content.Context; import com.xzy.retrofitdemo.Param; import com.xzy.retrofitdemo.RetrofitWrapper; import com.xzy.retrofitdemo.ShopBean; import com.xzy.retrofitdemo.service.ShopService; import retrofit2.Call; /** * Function:构建访问的model * Created by xuzhuyun on 2018/1/15. */ public class ShopBeanModel { private static ShopBeanModel famousInfoModel; private ShopService mFamousService; /** * 单例模式 * * @return */ public static ShopBeanModel getInstance(Context context) { if (famousInfoModel == null) { famousInfoModel = new ShopBeanModel(context.getApplicationContext()); } return famousInfoModel; } private ShopBeanModel(Context context) { mFamousService = (ShopService) RetrofitWrapper.getInstance().create(ShopService.class); } /** * 查询接口 * * @return */ public Call<ShopBean> queryLookUp(Param param) { Call<ShopBean> infoCall = mFamousService.getShop((int) param.getArg1(), (int) param.getArg2()); return infoCall; } }上面对Retrofit和访问model使用了单例模式,进行了封装,接口都写完了,下面是调用。
如何使用
构建好接口以后,可以使用了!
使用分为四步:
- 创建Retrofit对象
- 创建访问API的请求
- 发送请求
- 处理结果
主要代码如下:
ShopBeanModel shopBeanModel = ShopBeanModel.getInstance(this); //创建访问的API请求 Param param = new Param(); //构建请求参数实体 //pageSize = 10,curPage=1 param.setArg1(10); param.setArg2(1); Call<ShopBean> callFamous = shopBeanModel.queryLookUp(param); callFamous.enqueue(new Callback<ShopBean>() { @Override public void onResponse(Call<ShopBean> call, Response<ShopBean> response) { ShopBean result = response.body(); if (result != null) { Log.i(TAG, "onResponse2: " + result.toString()); } } @Override public void onFailure(Call<ShopBean> call, Throwable t) { Log.i(TAG, "onFailure: " + t.getMessage()); } });如果没有进行封装,则调用代码是这样的:
Retrofit retrofit = new Retrofit.Builder() .baseUrl(Constant.BASEURL) .addConverterFactory(GsonConverterFactory.create()) .build(); ShopService service = retrofit.create(ShopService.class); //pageSize = 10,curPage=1 Call<ShopBean> callShops = service.getShop(10, 1); callShops.enqueue(new Callback<ShopBean>() { @Override public void onResponse(Call<ShopBean> call, Response<ShopBean> response) { if (response.isSuccessful()) { ShopBean result = response.body(); Log.i(TAG, "onResponse1: " + result.toString()); } } @Override public void onFailure(Call<ShopBean> call, Throwable t) { } });