Retrofit2正式发布有一段时间了,官方也在刚刚出2.0beta版的时候就把官网更换了,所以使用retrofit,我们也不要纠结它与前面版本的不同了,就从2.0这个版本开始吧。
使用android studio开发工具,引入如下:
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
Retrofit支持Rxjava,所以我打算再写个Rxjava的例子,与普通使用做个对比。所以再进入这些库(不了解rxjava的就不要引入下面三个库了):
compile 'io.reactivex:rxjava:1.1.3'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
先看个简单效果,输入身份证号,判断身份证号的有效性,输出该人的生日:
功能很简单,接口我用的聚合数据提供的身份查询api,主要实现方式如下。
先展示一下这个url是这样的:
http://apis.juhe.cn/idcard/index?key=您申请的KEY&cardno=330326198903081211
首先需要一个接口(interface),把这个url封装:
public interface PersonApi {
@GET("index")
Call getPersonCardNum(@Query("key") String key, @Query("cardno") String num);
}
对于没有接触过retrofit的朋友,这里做一下解释:
@GET(“index”)
代表使用get方法请求,index是上面那个url里面问号前面的一部分,后面会拼接上前面的部分。
@Query
代表访问这个url的参数,这里的意思就是访问这个Url需要两个参数,一个是这个访问需要用到的秘钥,一个就是身份证号。
Call<PersonPojo>
这是返回的已经把json解析成实体的返回值。
接着需要一个网络引擎类,里面放的就是对数据的访问获取,首先是构造方法里面这么写:
public class Net {
private static PersonApi personApi;
private static OkHttpClient okHttpClient = new OkHttpClient();
private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();
public Net(){
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://apis.juhe.cn/idcard/")
.addConverterFactory(gsonConverterFactory)
.build();
personApi = retrofit.create(PersonApi.class);
}
OkHttpClient 是底层的网络访问工具,GsonConverterFactory.create()意思是内部的json解析工具gson的实例。在baseurl里面写上文的那个url的前半部分,其实就是我们平时用的主机的url。
接着就是写获取数据的方法了:
public void getPseronCardNum(String num, final OnCheckCardListener onCheckCardListener){
Call call = personApi.getPersonCardNum("fe15ed66cfb72823024958f4b1dc50e7", num);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
onCheckCardListener.OnSuccess(response.body());
}
@Override
public void onFailure(Call call, Throwable t) {
onCheckCardListener.OnError("error");
System.out.println("err");
}
});
}
OnCheckCardListener 是给activity用的回调接口。如果获取成功,就把解析好的实体传出去,如果失败,就传字符串“error”,简单明了。
接着看activity:
public class MainActivity extends AppCompatActivity implements OnCheckCardListener{
TextView card,result;
Button check;
Net net;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
net = new Net();
card = (TextView) findViewById(R.id.tv_card);
result = (TextView) findViewById(R.id.tv_result);
check = (Button) findViewById(R.id.btn_check);
check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
net.getPseronCardNum(card.getText().toString(),MainActivity.this);
}
});
}
@Override
public void OnSuccess(PersonPojo personPojo) {
if (personPojo.getResultcode().equals("200")) {
result.setText(personPojo.getResult().getBirthday());
} else {
result.setText(personPojo.getResultcode());
}
}
@Override
public void OnError(String msg) {
result.setText(msg);
}
}
这就是用Retrofit2做得简单的功能,仅仅是为了入门而已,其实Retrofit还有很多功能,就参数来说,比如访问restful的url的时候会用到@Path,还有以实体为参数时用到@Body等。
下面的部分是对上面功能用rxjava实现的,功能没变,所以直接粘贴代码。
public interface PersonApi {
@GET("index")
Call getPersonCardNum(@Query("key") String key, @Query("cardno") String num);
@GET("index")
Observable getPersonCardNum2(@Query("key") String key, @Query("cardno") String num);
}
网络引擎类,Net.java:
public class Net {
private static PersonApi personApi;
private static OkHttpClient okHttpClient = new OkHttpClient();
private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();
private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.create();
public Net(){
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://apis.juhe.cn/idcard/")
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJavaCallAdapterFactory)
.build();
personApi = retrofit.create(PersonApi.class);
}
public void getPseronCardNum(String num, final OnCheckCardListener onCheckCardListener){
Call call = personApi.getPersonCardNum("fe15ed66cfb72823024958f4b1dc50e7", num);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
onCheckCardListener.OnSuccess(response.body());
}
@Override
public void onFailure(Call call, Throwable t) {
onCheckCardListener.OnError("error");
System.out.println("err");
}
});
}
public void getPseronCardNum2(String num, final OnCheckCardListener onCheckCardListener){
Observable observable = personApi.getPersonCardNum2("fe15ed66cfb72823024958f4b1dc50e7", num);
observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber(){
@Override
public void onCompleted() {
System.out.println("complete");
}
@Override
public void onError(Throwable e) {
onCheckCardListener.OnError("error");
System.out.println("err");
}
@Override
public void onNext(PersonPojo personPojo) {
onCheckCardListener.OnSuccess(personPojo);
}
});
}
}
其他的都一样了,有上文的工程可以下载。
下载点这里