Android高效网络请求Retrofit框架

Retrofit已经升级到2.0版本了,之前在项目中一直使用Volley作为网络请求框架那么为什么我们要考虑替换到Retrofit呢。

compileSdkVersion 23
buildToolsVersion "23.0.2"

没错如果我们把我们app的编译版本修改成最新的时候Volley中的HttpClient类就会编译提示错误,还有一个原因是现在慢慢逐渐的RxAndroid+Retrofit的整合出现变成主线了基于这两个原因我们也跟上时代免得被out。

Retrofit是Square一个良心的企业开源的网络请求框架
https://github.com/square/retrofit
他是这么描述Retrofit:Type-safe HTTP client for Android and Java by Square,由于他的高性能以及使用简单慢慢变成了世面主流的Http网络请求框架了。

在Gradle中引入Retrofit:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

我们使用一个例子来描述如何使用Retrofit然后我们再做定制让它完美的适应于自己的应用中去。
首先我们需要定义一个接口

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

然后我们需要需要创建一个Retrofit对象

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

一切就绪之后在相对应的地方开启请求

Call<List<Repo>> call = service.listRepos("octocat");
call.enqueue(new Callback<List<Repo>>() { 
     @Override
     public void onResponse(Response<List<Repo>> response) { 
         Log.w(TAG, "Retrofit success ...");
     }
     @Override 
     public void onFailure(Throwable t) {
         Log.w(TAG, "Retrofit failed ...");
     }
});

是不是觉得很方便的就完成了一次网络请求,到时候我们就只需要在onResponse这个方法中取出我们想要的数据显示到UI界面上即可了。

JSON数据解析
在Retrofit中为我们提供了很多的JSON数据解析库我们只需要进行compile到gradle中就能愉快的使用起来了。

Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml

然后我们修改一下Retrofit的初始化设置

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

每次我们只需要修改addConverterFactory这个方法传入我们项目中使用的Json数据解析库即可。

自定义JSON数据解析
是不是你跟我一样那我项目中使用Fastjson作为Json数据解析库怎么自定义呢?首先我们需要自己定义一个类来实现Converter.Factory这个接口:

public class FastJsonConverterFactory extends Converter.Factory {

    @Override
    public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
        return super.fromResponseBody(type, annotations);
    }
}

可是到了这一步的时候好像懵了,下一步怎么做呢。所以我看了GsonConverterFactory的实现源码发现它在fromResponseBody中还自己定义一个GsonResponseBodyConverter来进行解析数据。所以我们如法炮制了一个出来:

final class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    @Override
    public T convert(ResponseBody value) throws IOException {
        return (T) JSON.parseObject(value.string(), NetMainResponse.class);
    }
}

这里我直接将服务器返回的结果都封装到NetMainResponse这个类中让它统一都返回NetMainResponse对象给我们然后我们在Callback中取出数据再做相对应的处理即可了。

call.enqueue(new Callback<NetMainResponse>() {
                    @Override
                    public void onResponse(Response<NetMainResponse> response, Retrofit retrofit) {
                        Log.w(TAG, "retrofit success...");
                        Log.w(TAG, "response = " + response.body().toString());
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        Log.w(TAG, "retrofit failed...");
                    }
                });

就这样我们自定义ConverterFactory类就完成了

Retrofit.Builder builder = new Retrofit.Builder().baseUrl(API_URL)
            .addConverterFactory(new FastJsonConverterFactory());// 添加FastJson来进行对数据解析

这样配置之后我们就能愉快的使用起Fastjson来进行数据解析了。

自定义Cookie
因为项目中有用到cookie这时候我又开始犹豫一个问题如何加入cookie呢?由于Retrofit嵌入OkHttpclient作为网络底层去请求网络,所以我们只要想办法在这方面入手即可了。

public class HttpHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request.Builder builder = chain.request().newBuilder();
        builder.addHeader("cookie", "cookie123456789");
        return chain.proceed(builder.build());
    }
}

实现Interceptor这个接口然后重新配置一下Retrofit这个对象就好了

public static void addOkHttpClientHeader() {
        httpClient.interceptors().add(new HttpHeaderInterceptor());
        retrofit = builder.client(httpClient).build();
    }

差不多了,平时一个Http网络请求就封装好了:一个Retrofit框架网络请求并以Fastjson作为Json数据解析还有支持添加cookie就完成了,接下来就是愉快的Http GET/POST各种请求了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值