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 的 详细使用

Android 网络请求框架之Retrofit 的 详细使用

Android 网络请求框架之Retrofit 的 详细使用

android之Retrofit使用