Retrofit2.0的简单使用例子

作者: RickGe | 来源:发表于2017-02-08 15:16 被阅读737次

    既然你已经想到了Retrofit,那么想必你也已经知道了OkHttp。Retrofit和OkHttp来自于同一家公司:Square。实际项目中我们经常会对OkHttp进行一次封装,然后再去使用。Square公司也对OkHttp做出了官方的封装,于是Retrofit2.0(英文意思:翻新、改型)就诞生了。。。那接下来我们就看看Retrofit怎么使用吧。Retrofit官方链接

    01 在Gradle中添加Retrofit的依赖库

    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    

    Retrofit为我们提供了以下Converter的类库,根据项目需要使用相应的Converter来进行序列化和反序列化。

    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
    

    02 定义Http请求接口

    Retrofit turns HTTP API into a Java interface
    下面是两个完整的请求路径,

    http://bmob-cdn-8458.b0.upaiyun.com/2017/02/08/13a6c06c40a866bb80e8373a6fceb9f6.json
    http://bmob-cdn-8458.b0.upaiyun.com/2017/02/08/52e5798640f46ff2803867f5199c92cf.json
    

    我们把其中一个URL拆分成三部分:

    BaseUrl: http://bmob-cdn-8458.b0.upaiyun.com/
    path: 2017/02/08/
    fileName: 13a6c06c40a866bb80e8373a6fceb9f6.json
    

    于是你就明白了下面的接口,每个方法返回的是我们的Call对象。

    public interface TweetService {
        // {fileName}相当于一个占位符,@PATH指的是通过参数填充路径,
        @GET("2017/02/08/{fileName}")
        Call<ResultBean<PageBean<TweetLike>>> listTweetLike(@Path("fileName") String fileName);
    
        @GET("2017/02/08/{fileName}")
        Call<ResultBean<PageBean<Tweet>>> listTweet(@Path("fileName") String fileName);
    }
    

    03 创建Retrofit 对象

    这里我们使用单例模式来获得Retrofit对象。同时你也可以看到刚才分拆的BaseURL。

    public class RetrofitUtil {
        private static volatile RetrofitUtil retrofitUtil = null;
        private Retrofit retrofit = null;
    
        private RetrofitUtil(){
            retrofit = new Retrofit.Builder()
                    // 设置BaseURL
                    .baseUrl("http://bmob-cdn-8458.b0.upaiyun.com/")
                    // 增加返回值为Gson的支持(以实体类返回)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
    
        private static RetrofitUtil getInstance(){
            if(retrofitUtil == null){
                synchronized (RetrofitUtil.class){
                    if(retrofitUtil == null){
                        retrofitUtil = new RetrofitUtil();
                    }
                }
            }
            return retrofitUtil;
        }
    
        public static Retrofit getRetrofit(){
            return getInstance().retrofit;
        }
    }
    

    04 发起网络请求

    使用Retrofit对象创建一个TweetService 接口对象,也就是我们前面定义的那个接口,调用相应的方法来得到我们的Call对象。这时我们使用Call对象就可以发出网络请求了。

    private void getTweetLikeAsync() {
            // retrofit.create(TweetService.class) 这里采用的是Java的动态代理模式来创建TweetService接口对象
            TweetService tweetService = RetrofitUtil.getRetrofit().create(TweetService.class);
            // 调用相应的方法来得到Call对象
            // 并且我们在这里把想要访问的具体数据文件名传了进来,于是Call就能获得完整的请求路径:BaseURL + path + fileName。
            Call<ResultBean<PageBean<TweetLike>>> callTweetLike = tweetService.listTweetLike("13a6c06c40a866bb80e8373a6fceb9f6.json");
            Call<ResultBean<PageBean<Tweet>>> callTweet = tweetService.listTweet("52e5798640f46ff2803867f5199c92cf.json");
            // call.enqueue() 发起网络请求,请求成功后执行回调方法的逻辑处理。
            callTweetLike.enqueue(new Callback<ResultBean<PageBean<TweetLike>>>() {
                @Override
                public void onResponse(Call<ResultBean<PageBean<TweetLike>>> call, Response<ResultBean<PageBean<TweetLike>>> response) {
                    ResultBean<PageBean<TweetLike>> resultBeanTweetLike = response.body();
                    Log.i("MainActivity Async", resultBeanTweetLike.toString());
                }
    
                @Override
                public void onFailure(Call<ResultBean<PageBean<TweetLike>>> call, Throwable t) {
                }
            });
    
            callTweet.enqueue(new Callback<ResultBean<PageBean<Tweet>>>() {
                @Override
                public void onResponse(Call<ResultBean<PageBean<Tweet>>> call, Response<ResultBean<PageBean<Tweet>>> response) {
                    ResultBean<PageBean<Tweet>> resultBeanTweet = response.body();
                    Log.i("MainActivity Async", resultBeanTweet.toString());
                }
    
                @Override
                public void onFailure(Call<ResultBean<PageBean<Tweet>>> call, Throwable t) {
                }
            });
        }
    

    05 同步请求

    上面的列子是一个异步请求,下面是一个同步网络请求的例子,所以需要放在子线程执行。

    private void getTweetLikeSync() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    TweetService tweetService = RetrofitUtil.getRetrofit().create(TweetService.class);
                    Call<ResultBean<PageBean<TweetLike>>> callTweetLike = tweetService.listTweetLike("13a6c06c40a866bb80e8373a6fceb9f6.json");
                    Call<ResultBean<PageBean<Tweet>>> callTweet = tweetService.listTweet("52e5798640f46ff2803867f5199c92cf.json");
    
                    try {
                        Response<ResultBean<PageBean<TweetLike>>> responseTweetLike = callTweetLike.execute();
                        ResultBean<PageBean<TweetLike>> resultBeanTweetLike = responseTweetLike.body();
                        Log.i("MainActivity Sync", resultBeanTweetLike.toString());
    
                        Response<ResultBean<PageBean<Tweet>>> responseTweet = callTweet.execute();
                        ResultBean<PageBean<Tweet>> resultBeanTweet = responseTweet.body();
                        Log.i("MainActivity Sync", resultBeanTweet.toString());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    

    06 源码

    下载地址

    Retrofit Project.png

    相关文章

      网友评论

        本文标题:Retrofit2.0的简单使用例子

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