项目中快速搭建Retrofit

标签: android Retrofit 封装
311人阅读 评论(0) 收藏 举报
分类:

本篇博客将和大家分享如何在项目中快速搭建Retrofit。关于Retrofit的基本使用方法网上的例子很多,大家可自行参考,这里,我也给大家分享几个比较好的入门文章,仅供参考:

https://gold.xitu.io/entry/579f1749a633bd006009eca4
首先要引入该库:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

今天的主题是和大家分享如何在项目中快速搭建一个Retrofit。首先我们知道,网络请求实例在App中都是以单例模式存在的。所以我们就需要创建一个网络请求工具类来封装。

关于单例模式的写法,相信大家都不陌生,单例模式的实现方式很多种:懒汉式,饿汉式,枚举,内部类等等。。这里我就不一一详细说明了。下面来看代码:

package com.example.song.retrofittest.model;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * Created by Song on 2016/8/30.
 */
public class HttpUtils {

    private static Retrofit mRetrofit;
    private static volatile HttpUtils httpUtils;
    private HttpUtils() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl("")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

    }

    public static HttpUtils getInstance() {
        if(httpUtils == null) {
            synchronized (HttpUtils.class) {
                if(httpUtils == null) {
                    httpUtils = new HttpUtils();
                    return httpUtils;
                }
            }
        }
        return httpUtils;
    }
从上面代码我们看到:

(1)私有构造函数中,我们初始化了Retrofit。

(2)公开getInstance方法用来实现单例模式。

现在Retorfit初始化完了。就可以使用该对象来操作网络请求了。我们知道,Retrofit发送请求需要使用create方法。来看下源码:

public <T> T create(final Class<T> service) {
  Utils.validateServiceInterface(service);
  if (validateEagerly) {
    eagerlyValidateMethods(service);
  }
  return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
      new InvocationHandler() {
        private final Platform platform = Platform.get();

        @Override public Object invoke(Object proxy, Method method, Object... args)
            throws Throwable {
          // If the method is a method from Object then defer to normal invocation.
          if (method.getDeclaringClass() == Object.class) {
            return method.invoke(this, args);
          }
          if (platform.isDefaultMethod(method)) {
            return platform.invokeDefaultMethod(method, service, proxy, args);
          }
          ServiceMethod serviceMethod = loadServiceMethod(method);
          OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
          return serviceMethod.callAdapter.adapt(okHttpCall);
        }
      });
}
上面就是Retrofit的create方法的源码,大致可以看出,create方法使用了泛型来控制参数和返回参数的类型保持一致。细心的小伙伴肯定看到了Proxy.newProxyInstance()方和new InvocationHandler(){}!!没错,这不就是Java中的动态代理机制吗!!!并且我们看到在invoke方法中,对method进行一些判断并封装成ServiceMethod方法,通过okhttpCall来发送请求。

通过上面的分析,我们就需要公开一个create方法,下面来看代码:

public <T>T create(Class<T> cls) {
    return mRetrofit.create(cls);
}
可以看到,我们在create方法中,通过调用Retrofit实例的create方法来返回具体的请求服务实例。
这样,一个Retrofit的网络请求封装就完成了。在Activity中具体使用:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        LoadData loadData = HttpUtils.getInstance().create(LoadData.class);
        loadData.loadData("001");
    }
}
ok,到这里对Retorfit的封装就完成了。分分钟搞定Retrofit的集成使用!!

查看评论

Retrofit在项目中的实战应用

我们项目网络处理用的就是Retrofit框架,今天就先研究下如何使用(知其然),就应用层面做了解,后续再研究其所以然,准备用例子一个一个的分析 每个函数都必须带有 HTTP 注解来表明请求方式和请求的...
  • wqb1319856391
  • wqb1319856391
  • 2015-08-28 15:24:20
  • 661

Android中如何实现ListView的分页加载

上一篇我粗略的说了下实现ListView下拉刷新的主要步骤,接下来我就如何实现ListView的分页加载来说下主要实现步骤: 1.继承ListView,ListView有一个addFooterVie...
  • u013718120
  • u013718120
  • 2015-07-16 14:31:34
  • 663

Android NDK(五):JNI字段和方法

上一篇博客介绍了JNI数组的基本使用。Android NDK(四):JNI 数组 本篇内容将和大家分享本地方法与jvm中任意对象的字段和方法进行交互。比如,在本地方法中调用Java中的方法。也就是常...
  • u013718120
  • u013718120
  • 2017-03-22 16:50:08
  • 680

Volley的简单使用

13年,Google大会上的新技术:Volley( 万箭齐发 ) 使得在android上改变网络请求的高效率得以实现。 下面,我就向大家简单介绍下在实际项目中如何使用Volley进行网络数据的请求。...
  • u013718120
  • u013718120
  • 2015-09-14 15:52:10
  • 349

2016,回忆与展望

本来计划年末最后一篇文章是要和大家分享Glide源码分析的,鉴于昨天没有整理好,只好留在2017年的第一篇文章了。今天是16年的最后一天了,相信大家心里都有一种兴奋激动说不出的感觉。我也是,以至于我昨...
  • u013718120
  • u013718120
  • 2016-12-31 13:05:17
  • 539

Activity生命周期图示

  • u013718120
  • u013718120
  • 2015-07-13 23:10:45
  • 308

Retrofit项目封装使用

一、概述1、Retrofit开源项目地址2、Retrofit项目官网上官网可能要梯子,大家自备,官网上有它的一系列基本用法,以及他的介绍:A type-safe HTTP client for And...
  • Zzz_Zzz_Z
  • Zzz_Zzz_Z
  • 2016-07-13 00:15:24
  • 4790

Retrofit在项目中的应用

定义一个注解,用来对bean进行要序列化的字段 import java.lang.annotation.Documented; import java.lang.annotation.ElementT...
  • lizelinll
  • lizelinll
  • 2015-01-03 15:21:29
  • 40622

MVP + Retrofit

  • 2016年11月15日 15:39
  • 34.76MB
  • 下载

RxJava和Retrofit的简单使用

在最近做的项目中,因为频繁用到网络请求,所以使用了现在比较流行的框架RxJava和Retrofit来代替之前的Okhttp的繁琐请求。 我这边写的比较简单,自己在小项目中更使用的,如果需要深入研...
  • u012602304
  • u012602304
  • 2018-01-28 19:10:10
  • 51
    个人资料
    专栏达人
    等级:
    访问量: 54万+
    积分: 6221
    排名: 4972
    博客专栏
    最新评论
    关于我