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‘

接口类

先看个简单效果,输入身份证号,判断身份证号的有效性,输出该人的生日:

功能很简单,接口我用的聚合数据提供的身份查询api,主要实现方式如下。

先展示一下这个url是这样的:

http://apis.juhe.cn/idcard/index?key=您申请的KEY&cardno=330326198903081211

首先需要一个接口(interface),把这个url封装:

public interface PersonApi {

    @GET("index")
    Call<PersonPojo> 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<PersonPojo> call = personApi.getPersonCardNum("fe15ed66cfb72823024958f4b1dc50e7", num);

        call.enqueue(new Callback<PersonPojo>() {
            @Override
            public void onResponse(Call<PersonPojo> call, Response<PersonPojo> response) {
                onCheckCardListener.OnSuccess(response.body());
            }

            @Override
            public void onFailure(Call<PersonPojo> 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<PersonPojo> getPersonCardNum(@Query("key") String key, @Query("cardno") String num);

    @GET("index")
    Observable<PersonPojo> 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<PersonPojo> call = personApi.getPersonCardNum("fe15ed66cfb72823024958f4b1dc50e7", num);

        call.enqueue(new Callback<PersonPojo>() {
            @Override
            public void onResponse(Call<PersonPojo> call, Response<PersonPojo> response) {
                onCheckCardListener.OnSuccess(response.body());
            }

            @Override
            public void onFailure(Call<PersonPojo> call, Throwable t) {
                onCheckCardListener.OnError("error");
                System.out.println("err");
            }
        });
    }

    public  void getPseronCardNum2(String num, final OnCheckCardListener onCheckCardListener){
       Observable<PersonPojo> observable = personApi.getPersonCardNum2("fe15ed66cfb72823024958f4b1dc50e7", num);
        observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<PersonPojo>(){

            @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);
            }
        });
    }
}

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

下载点这里

时间: 2024-11-08 22:40:04

Retrofit2简单使用的相关文章

Retrofit2的使用简单介绍

先接触的时候肯定先去网上找了找相关资料,大部分是Retrofit1.9,最新的版本都2了,所以看了这个帖子http://blog.csdn.net/u012301841/article/details/49685677:这里先感谢下: 例子的代码直接贴出来:首先是Retrofit的初始化这里使用Gson解析的,所以: private static Retrofit initRetrofit() { OkHttpClient httpClient = new OkHttpClient(); if

Retrofit2实现App自动更新

原理 Retrofit2和okhttp实现了apk的下载 自定义类实现Retrofit2的Callback类在里面通过IO流写入文件并且使用RxBus订阅下载进度 自定义类实现okhttp3的ResponseBody类并且在里面使用RxBus发布下载进度信息 在Service中使用Retrofit在后台下载文件 发送Notifaction到通知栏前台界面展示进度情况 实现步骤 1.创建UpdateManger管理类 这个类主要写了两个管理更新和弹框的方法. /** - 检测软件更新 */ pub

浅谈Retrofit2+Rxjava2

近几年,Retrofit犹如燎原之火搬席卷了整个Android界.要是不懂Retrofit,简直不好意思出门...由于近几个项目都没用到Retrofit,无奈只能业余时间自己撸一下,写的不好的地方,还请不吝赐教.要集成retrofit,在app的bild.gradle中添加库以来就可以: compile 'com.squareup.retrofit2:retrofit:2.3.0' 如果需要集成json解析,还需要添加库: compile 'com.squareup.retrofit2:conv

Retrofit2.0 公共参数(固定参数)

请先阅读: Retrofit 动态参数(非固定参数.非必须参数)(Get.Post请求) 在实际项目中,对于有需要统一进行公共参数添加的网络请求,可以使用下面的代码来实现: RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(ctx).setRequestInterceptor(new RequestInterceptor() { @Override public void intercept(RequestFacad

android快捷开发之Retrofit网络加载框架的简单使用

大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据进行解析解决,而我们自己学的东西大多数情况下都没有针对网络很糟糕的情况进行优化.下面就给大家带来Square Inc这家有创新精神的公司留下的Retrofit网络加载库的使用! Retrofit封装了从Web API下载数据,解析成一个普通的java对象(POJO),这里我们就去天狗网使用他们的一个

Retrofit2.0使用

随着Google对HttpClient 摒弃,和Volley的逐渐没落,OkHttp开始异军突起,而Retrofit则对okHttp进行了强制依赖. Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端, 如果看源码会发现其实质上就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层, 其将请求返回javaBean,对网络认证 REST API进行了很好对支持此,使用Retrofit将会极大的提高我们应

Retrofit基本介绍和简单的使用方式

Retrofit:Android和Java的类型安全的HTTP客户端. Introduction: 1.Retrofit把你的HTTP API转换成Java接口 <span style="font-size:14px;">public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user&qu

Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava

Retrofit2.0通俗易懂的学习姿势,Retrofit2.0 + OkHttp3 + Gson + RxJava Retrofit,因为其简单与出色的性能,也是受到很多人的青睐,但是他和以往的通信框架还是有点区别,不过放心,因为他本身还是挺简单的,所有我相信你看完这篇文章,对基本的请求是没什么问题的,其实现在网上这样的文章也有很多了,好了,那我们直接开车吧! 一.相关资料 Github:https://github.com/square/retrofit 官网文档:http://square

Retrofit2源码解析

最近项目将网络框架换成Retrofit2.0.2,文中说的Retrofit都是指的Retrofit2这里要说明一下,毕竟和Retrofit1差别还是蛮大的,结合Okhttp,RxJava还是比较好用的,网上有很多前辈介绍过使用方法,本文是想研究一下Retrofit的源码.关于Retrofit的介绍可以查阅Retrofit的官方网站 直接进入主题:(注本文是结合RxJava介绍的,最好可以了解一下RxJava不了解也没有关系,大部分的思想是一样的) Retrofit的基本使用 Retrofit使用