使用Retrofit框架

先添加几个权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

build.gradle添加依赖,下面会用到的也在这里了:

compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.3.0'
compile 'com.squareup.okio:okio:1.7.0'
 compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'com.android.support:recyclerview-v7:23.4.0'

两个retrofit依赖包,两个okhttp依赖包,okhttp3:logging-interceptor依赖包主要是拦截请求日志使用,引入下面 要使用的rxandroid的两个依赖包reactivex:rxandroid和reactivex:rxjava,recyclerview主要是新 闻列表页要使用的。

创建Retrofit对象

页面写好了。下面我们通过单例形式创建一个Retrofit对象。

public class HRetrofitNetHelper{
    public static HRetrofitNetHelper mInstance;
    public Retrofit mRetrofit;
    //本地ip为192.168.1.103
    public static final String BASE_URL = "http://192.168.1.103:8080/GoachWeb/";
    private HRetrofitNetHelper(){
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .build();
    }
    public static HRetrofitNetHelper getInstance(){
        if(mInstance==null){
            synchronized (HRetrofitNetHelper.class){
                if(mInstance==null)
                    mInstance = new HRetrofitNetHelper ();
            }
        }
        return mInstance ;
    }
}

简单的创建好了一个Retrofit。这里只是配置了一个接口的baseUrl,也就是根路径。

配置ConverterFactory

如果要Retrofit直接将json转换为为Dao对象。那么我们就要通过addConverterFactory来配置,如下:

mRetrofit = new Retrofit.Builder()
               .addConverterFactory(GsonConverterFactory.create())
               .build();

上面是使用依赖:compile'com.squareup.retrofit2:converter-gson:2.0.2'包。然后addConverterFactory来配置。通过源码方法addConverterFactory(Converter.Factory factory)我们可以看到要传入一个继承Converter.Factory的对象。Retrofit里面就有这样的对象,这里我们用的是Gson来进行解析,那就有对应的GsonConverterFactory。那好下面就来创建这个对象

创建这个对象有两种方式

  • 一种是像上面写的一样

GsonConverterFactory.create()
这种方式就是简单的创建默认的Gson对象,然后像我们平常一样转换为Dao对象。

  • 还有一种方式就是通过GsonBuilder创建Gson对象

比如这里统一把后台提供的带有yyyy-MM-dd HH:mm:ss格式的Date对象,客户端如果用上面这种方式创建的话,会报下面这个错

java.text.ParseException: Failed to parse date ["2016-06-11 20:57:28']: Invalid time zone indicator ' ' (at offset 0)

这种情况下,我们就可以这样:

Gson mGson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss").create();
然后再创建GsonConverterFactory对象的时候传入Gson
.addConverterFactory(GsonConverterFactory.create(mGson))

就可以很好的解决这个问题了。

这里只是说了使用Gson进行解析,其实Retrofit还提供了其他的一些解析工具,如下:

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
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

用法类似这样:
导入包(xx可以指Jackson或者Moshi等等):compile 'com.squareup.retrofit2:converter-xx:2.0.2'然后:.addConverterFactory(xxConverterFactory.create(mGson))

当然,我们还是可以设置多个converter比如支持 proto 格式和json格式。那么如下添加:

Retrofit retrofit = new Retrofit.Builder()
      //...
    .addConverterFactory(ProtoConverterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    .build();

ProtoConverterFactoryGsonConverterFactory添加 converter 的顺序很重要。Retrofit会依次询问每一个 converter 能否处理一个类型。当Retrofit试图反序列化一个 proto 格式,它其实会被当做 JSON 来对待。所以Retrofit会先要检查 proto buffer 格式,然后才是 JSON。所以要先添加ProtoConverterFactory,然后是GsonConverterFactory。
又比如我们需要Retrofit支持RxJava。添加:

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

就好了。

大胖倪的慢灵魂 wechat
感觉有用打赏一个呗~