Retrofit2简单使用

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'

接口类

先看个简单效果,输入身份证号,判断身份证号的有效性,输出该人的生日:
Retrofit2简单使用_第1张图片
功能很简单,接口我用的聚合数据提供的身份查询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的实体

下面的部分是对上面功能用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);
            }
        });
    }
}

其他的都一样了,有上文的工程可以下载。
下载点这里

你可能感兴趣的:(Retrofit2简单使用)