美文网首页
Retrofit的使用(一)

Retrofit的使用(一)

作者: YC1995 | 来源:发表于2019-11-14 23:29 被阅读0次

    介绍

    Retrofit的英文意思是改进。是一个网络请求框架,底层本质走的是OkHttp。Retrofit实质是对OkHttp进行了封装,将Http请求抽象成Java的接口。

    定义Http请求

    Retrofit将每一个Http请求抽象成Java接口中的方法。用注解配置网络请求的参数。例如:

    public interface MusicService {
        @GET("/searchMusic")
        Call<Result> queryMusicByName(@QueryMap Map<String, Object> options);
    }
    

    定义了一个MusicService接口中的queryMusicByName代表了一个网络请求。方法上面的@GET("/searchMusic")注解描述了该网络请求是GET方法,网络请求的path是/searchMusic。至此就定义好了一个http的网络请求。

    创建Retrofit实例

    一个http请求定义好之后,那就要思考这个http请求要用什么来发送出去。那就了解一下怎么创建Retrofit实例。

     Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.apiopen.top")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    

    retrofit采取builder模式进行构造,上面的例子分别通过Builder设置host、添加数据转化器。

    发送网络请求

    知道了怎么创建一个retrofit实例,有了发送网络请求的工具。那接下来就是需要了解一下怎么把一个网络请求发送出去了。

    先是创建接口的实例

    MusicService musicService = retrofit.create(MusicService.class);
    

    接着是通过接口实例调用定义的Http请求方法获取Call对象。

     Call<Result> call = musicService.queryMusicByName(params);
    

    最后是通过call方法执行同步或者异步请求将http请求发送出去

    • 同步请求
    //不能再主线程中执行同步请求
    try {
       call.execute();
    } catch (IOException e) {
       e.printStackTrace();
    }
    
    • 异步请求
    call.enqueue(new Callback<Result>() {
                @Override
                public void onResponse(Call<Result> call, Response<Result> response) {
                    //回调已经是主线程 可以执行UI操作
                }
    
                @Override
                public void onFailure(Call<Result> call, Throwable t) {
                  //回调已经是主线程 可以执行UI操作
                }
            });
    

    注意:同步请求不能在Android主线程中发起。异步请求的CallBack回调相比于OkHttp,Retrofit已经做了线程的切换处理,回调方法已经是主线程可以执行相应的UI操作。

    OkHttp的简单使用

    既然retrofit是在OkHttp之上做了一层封装,那简单看一下相比于OkHttp,Retrofit有什么不同。先看一下OkHttp的简单用法。

    • OKHttp的异步请求
     OkHttpClient httpClient = new OkHttpClient.Builder().build();
            Request request = new Request.Builder()
                    .url("http://api.apiopen.top")
                    .build();
            httpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                      //回调是子线程,不能做UI操作
                }
    
                @Override
                public void onResponse(Call call, final Response response) throws IOException {
                      //回调是子线程,不能做UI操作
                }
            });
    

    使用OkHttp发起一个请求首先是创建一个OkHttpClient实例,接着构造一个Request请求,再通过OkHttpClient实例调用newCall(Request)方法得到一个Call实例。最后就跟Retrofit一样了,通过调用enqueue()方法发起网络请求。不过跟Retrofit不同的是,回调的onResponseonFailure是执行在子线程的。

    • OkHttp的同步请求
     try {
         Response response = httpClient.newCall(request).execute();
      } catch (IOException e) {
          e.printStackTrace();
     }
    

    同样的同步请求不能在主线程发起,否则会crash。

    相关文章

      网友评论

          本文标题:Retrofit的使用(一)

          本文链接:https://www.haomeiwen.com/subject/cksdictx.html