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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值