Android网络请求框架之Retrofit
Posted ykb19891230
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络请求框架之Retrofit相关的知识,希望对你有一定的参考价值。
Retrofit之前言
Retrofit是square家族开源系列的精品之一,是一个简单好用的网络请求框架,基于REST的架构风格,本框架的主要开发人Jake Wharton想必大家也有所耳闻,他也是REST的忠实拥护者和践行者。
引入开源框架,大部分开发者的目的是为了更快速的开发应用,省掉一些复杂的逻辑处理,Retrofit封装了网络请求,让开发者面向接口去请求服务,使用注解和代理去发起真正的请求,让开发者省掉所有网络请求的代码。你不用担心android6.0不支持httpclient方式的请求,你也不用引入gson去转换数据与对象,所有的这一切,Retrofit都已帮你完美实现。
Retrofit之用法
声明:
1.以下例子是基于1.9.0版本的,后面还有2.0.0版的,下一篇文章我将给大家展示他们之间的区别;
2.列子代码是基于AndroidStudio的。
1.在build.gradle文件里引入Retrofit需要的版本com.squareup.retrofit:retrofit:1.9.0,当然,如果了解RxJava和RxAndroid的童鞋也可以引入 io.reactivex:rxjava:1.0.14 、io.reactivex:rxandroid:1.0.1,配合Retrofit使用会更加好用。
2.实现Callback接口
public abstract class RCallback<T> implements retrofit.Callback<T>
@Override
public abstract void success(T t, Response response);
@Override
public void failure(RetrofitError error)
Global.ProcException(error);
看到泛型T,估计大家就知道意味着什么了吧?我们可以直接指定返回的对象了,不用再去解析json数据了!
3.封装请求的载体
public class RestAdapterFactory
private HashMap<String, SoftReference<RestAdapter>> adapters;
private static volatile RestAdapterFactory maker;
private RestAdapterFactory()
adapters = new HashMap<>();
/**
* 获取创建RestAdapter的工厂
*
* @return
*/
public synchronized static RestAdapterFactory getInstance()
synchronized (RestAdapterFactory.class)
if (null == maker)
synchronized (RestAdapterFactory.class)
maker = new RestAdapterFactory();
return maker;
/**
* 创建RestAdapter
*
* @param url
* @return
*/
public synchronized RestAdapter build(final String url)
//这就是发起请求的对象
RestAdapter adapter = null==adapters.get(url)?null:adapters.get(url).get();
if (null == adapter)
final CellInfo cellInfo = Utils.getCellInfo();
//添加一些header
RequestInterceptor requestInterceptor = new RequestInterceptor()
@Override
public void intercept(RequestFacade request)
request.addHeader("Authorization", String.format("Bearer %s", MainApp.getToken()));
request.addHeader("LoyoPlatform", cellInfo.getLoyoPlatform());
request.addHeader("LoyoAgent", cellInfo.getLoyoAgent());
request.addHeader("LoyoOSVersion", cellInfo.getLoyoOSVersion());
request.addHeader("LoyoVersionName", Global.getVersionName());
request.addHeader("LoyoVersionCode", String.valueOf(Global.getVersion()));
;
//指定url,设置log级别,设置拦截器。。。。。。
adapter = new RestAdapter.Builder().setEndpoint(url).setLogLevel(RestAdapter.LogLevel.FULL).setRequestInterceptor(requestInterceptor).build();
adapters.put(url, new SoftReference<>(adapter));
return adapter;
对于这个类就不详细解释了,就是封装了RestAdapter,用于发起请求。
4.定义请求接口和发起请求
public interface ITask
@GET("/task/Id")
void getTask(@Path("Id") String Id, retrofit.Callback<Task> cb);
@DELETE("/task/Id")
void deleteTask(@Path("Id") String Id, retrofit.Callback<Task> cb);
@GET(FinalVariables.tasks + "template/id")
void getTpl(@Path("id") String id, Callback<TaskTpl> cb);
@DELETE(FinalVariables.tasks + "template/id")
void deleteTpl(@Path("id") String id, Callback<TaskTpl> cb);
@GET("/task/query")
void getTasks(@QueryMap HashMap<String, Object> body,Callback<PaginationX<Task>> callback);
@POST("/task")
void create(@Body HashMap<String, Object> body, retrofit.Callback<Task> cb);
先解释一下一些注解,其实也不用解释,看单词的意思大家也明白啦。
方法上的:@PUT-修改,@DELETE-删除,@POST-创建,@GET-获取。。。。。。
方法上的注解后面括号里的字符串就是这些请求指向的服务端地址,比如说服务器主地址是http://192.168.3.1:9527,那么getTask指向的地址就是http://192.168.3.1:9527/task,所需参数是一个String类型的id,查询后返回的对象就是Task。是不是很简单?
方法变量的:@Path-查询主键,@QueryMap-查询所需的参数集合,可以是任意对象。。。
比如我们查询Task列表
@Override
public void GetData()
//这就是@QueryMap需要的参数
HashMap<String, Object> map = new HashMap<>();
map.put("pageIndex", pagination.getPageIndex());//当前页标
map.put("pageSize", isTopAdd ? lstData.size() >= 20 ? lstData.size() : 20 : 20);//需要的数量
map.put("joinType", mJoinType);//任务的类型
map.put("status", mStatus);//任务的状态
map.put("endAt", System.currentTimeMillis() / 1000);//截止时间 s
map.put("startAt", DateTool.getDateToTimestamp("2014-01-01", app.df5) / 1000);//起始时间 s
//发起请求,这里create方法返回的其实是ITask的代理类 RestAdapterFactory.getInstance().build(Config_project.API_URL()).create(ITask.class).getTasks(map, new RCallback<PaginationX<Task>>()
@overide
public void success(PaginationX<Task> paginationXTasks,Response r)
//获取分页里的数据
ArrayList<Task> tasks=paginationXTasks.getData();
mAdapter.setData(tasks);
mAdapter.notifyDataSetChanged();
@Overide
public void failure(RetrofitError e)
);
这里返回的是我们封装过的PaginationX对象,是一个分页数据封装,里面最终的数据就是Task数组。
简单的几步是不是就完成了一个请求和更新界面?奏是这么任性!
当然,Retrofit的用法肯定不止这些,大家可以去翻墙查询Retrofit官网,上面有很详细的API解释,下一篇我将用RxJava和RxAndroid配合Retrofit使用,进一步简化代码,也让大家进一步了解Retrofit。
以上是关于Android网络请求框架之Retrofit的主要内容,如果未能解决你的问题,请参考以下文章
Android 网络请求框架之Retrofit 的 详细使用
Android 网络请求框架之Retrofit 的 详细使用
Android 网络请求框架之Retrofit 的 详细使用