Retrofit2+OkHttp3+RxJava搭建网络框架

Retrofit2+OkHttp3+RxJava搭建网络框架

和别人分享你的知识,那才是永恒之道。之前跟朋友闲聊的时候,从朋友那里知道了安卓的几个最新的框架,其中就包括本博要说的Retrofit和RxJava。当时听朋友说的有多么多么好,多么多么的高效,本人也是出于对技术的追求,回来后自己网上搜了搜,相关资料还是挺多的,并且好评率极高,自己也受益匪浅。最近刚又开了一个项目,刚好可以那这个项目练练手,所以也跟着大牛学着搭建了这么一个网络框架,在这里分享出来,如有感觉那里不对,或是有更好想法的地方,还请各位动动手,给出宝贵意见。废话不多说了,直接上代码了。

首先封装一个获取Retrofit,并集成0kHttp3的抽象基类

  public abstract class RetrofitUtils {

    //服务器路径
    private static final String API_SERVER = "http://192.168.16.147:8080";

    private static Retrofit mRetrofit;
    private static OkHttpClient mOkHttpClient;

    /**
     * 获取Retrofit对象
     *
     * @return
     */
    protected static Retrofit getRetrofit() {

        if (null == mRetrofit) {

            if (null == mOkHttpClient) {
                mOkHttpClient = OkHttp3Utils.getOkHttpClient();
            }
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(API_SERVER + "/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(mOkHttpClient)
                    .build();

        }

        return mRetrofit;
    }

}

从Retrofit升级到2.0之后,就使用了build设计模式(生产者模式),将一个复杂的构建与其表示相分离。

  • baseUrl(API_SERVER + “/”):设置服务器路径
  • addConverterFactory(GsonConverterFactory.create()):添加转化库,默认是Gson
  • addCallAdapterFactory(RxJavaCallAdapterFactory.create()):添加回调库,采用RxJava
  • client(mOkHttpClient):设置使用okhttp网络请求

设置服务器就不多说了,是为了方便大家管理。添加转化库,为了能把网络数据直接解析成我们想要的javabeam,方便操作。添加回调库,这里采用的是RxJava,关于为什么使用RxJava,大家网上一搜就知道了,我就不多说啥了。最后是设置okhttp为网络请求,okhttp是高性能的http库,拥有队列线程池,轻松解决并发,自动维护socket连接池,所以这里使用okhttp可谓是更上一层楼。

然后就是要设置OkHttpClient请求的

public class OkHttp3Utils {

    private static OkHttpClient mOkHttpClient;

    //设置缓存目录
    private static File cacheDirectory = new File(MyApplication.getInstance().getApplicationContext().getCacheDir().getAbsolutePath(), "MyCache");
    private static Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024);


    /**
     * 获取OkHttpClient对象
     *
     * @return
     */
    public static OkHttpClient getOkHttpClient() {

        if (null == mOkHttpClient) {
            mOkHttpClient = new OkHttpClient.Builder()
                    .cookieJar(new CookiesManager())
                    //.addInterceptor(new MyIntercepter())
                    //.addNetworkInterceptor(new CookiesInterceptor(MyApplication.getInstance().getApplicationContext()))
                    //设置请求读写的超时时间
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .cache(cache)
                    .build();
        }
        return mOkHttpClient;
    }
}

同样升级到okhttp3后,也使用build设计模式。

  • cookieJar(new CookiesManager()): 设置一个自动管理cookies的管理器
  • addInterceptor(new MyIntercepter()):添加拦截器 addNetworkInterceptor(new
  • CookiesInterceptor(MyApplication.getInstance().getApplicationContext())):添加网络连接器
  • connectTimeout(30, TimeUnit.SECONDS):请求超时时间 writeTimeout(30,
  • TimeUnit.SECONDS):写入超时时间 readTimeout(30, TimeUnit.SECONDS):读取超时时间

OkHttp相信已经有好多人都在用它了,我就不多说什么了。

前面两部做完了现在就可以使用了。

public class NetWorks extends RetrofitUtils {

    //创建实现接口调用
    protected static final NetService service = getRetrofit().create(NetService.class);

    //设缓存有效期为1天
    protected static final long CACHE_STALE_SEC = 60 * 60 * 24 * 1;
    //查询缓存的Cache-Control设置,使用缓存
    protected static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;
    //查询网络的Cache-Control设置。不使用缓存
    protected static final String CACHE_CONTROL_NETWORK = "max-age=0";

    private interface NetService {

        //POST请求
        @FormUrlEncoded
        @POST("bjws/app.user/login")
        Observable getVerfcationCodePost(@Field("tel") String tel, @Field("password") String pass);

        //POST请求
        @FormUrlEncoded
        @POST("bjws/app.user/login")
        Observable getVerfcationCodePostMap(@FieldMap Map map);

        //GET请求
        @GET("bjws/app.user/login")
        Observable getVerfcationGet(@Query("tel") String tel, @Query("password") String pass);


        //GET请求,设置缓存
        @Headers("Cache-Control: public," + CACHE_CONTROL_CACHE)
        @GET("bjws/app.user/login")
        Observable getVerfcationGetCache(@Query("tel") String tel, @Query("password") String pass);


        @Headers("Cache-Control: public," + CACHE_CONTROL_NETWORK)
        @GET("bjws/app.menu/getMenu")
        Observable getMainMenu();

    }

    //POST请求
    public static void verfacationCodePost(String tel, String pass,Observer observer){
        setSubscribe(service.getVerfcationCodePost(tel, pass),observer);
    }


    //POST请求参数以map传入
    public static void verfacationCodePostMap(Map map,Observer observer) {
       setSubscribe(service.getVerfcationCodePostMap(map),observer);
    }

    //Get请求设置缓存
    public static void verfacationCodeGetCache(String tel, String pass,Observer observer) {
        setSubscribe(service.getVerfcationGetCache(tel, pass),observer);
    }

    //Get请求
    public static void verfacationCodeGet(String tel, String pass,Observer observer) {
        setSubscribe(service.getVerfcationGet(tel, pass),observer);
    }

    //Get请求
    public static void verfacationCodeGetsub(String tel, String pass, Observer observer) {
        setSubscribe(service.getVerfcationGet(tel, pass),observer);
    }

    //Get请求
    public static void Getcache( Observer observer) {
        setSubscribe(service.getMainMenu(),observer);
    }

    public static  void setSubscribe(Observable observable, Observer observer) {
        observable.subscribeOn(Schedulers.io())
                .subscribeOn(Schedulers.newThread())//子线程访问网络
                .observeOn(AndroidSchedulers.mainThread())//回调到主线程
                .subscribe(observer);
    }

}

接口已经创建出来了,Retrofit是用注解来完成设置的,要访问的url,请求方式,请求头。
常用的注解:
@GET GET请求方式
@POST POST请求方式
@Query GET请求参数
@Header用来添加Header请求头
@FormUrlEncoded post请求头标示
其他注解请求方式:
@PUT 表示这是一个PUT请求
@DELETE 表示这是一个DELETE请求
@HEAD 表示这是一个HEAD请求
@OPTIONS 表示这是一个OPTION请求
@PATCH 表示这是一个PAT请求

把网络接口统一放到一个接口类中,让Retrofit创建实现接口来方便调用。setSubscribe方法其实就是插入观察者。

最后就是在activity中调用。

public class MainActivity extends AppCompatActivity {

    private TextView mTv,mTv2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTv =(TextView) findViewById(R.id.main_tv);
        mTv2 =(TextView) findViewById(R.id.main_tv2);


        NetWorks.verfacationCodePost("15910435235", "123456", new Observer() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                mTv.setText(e.getLocalizedMessage());
                Log.e("MAIN2",e.getLocalizedMessage()+"--"+e.getMessage());
            }

            @Override
            public void onNext(Verification verification) {
                mTv.setText(verification.getUser().toString());
            }
        });






 NetWorks.Getcache(new Observer() {
     @Override
     public void onCompleted() {
        //完成
     }

     @Override
     public void onError(Throwable e) {
         //异常
         mTv2.setText(e.getLocalizedMessage());
         Log.e("MAIN2",e.getLocalizedMessage()+"--"+e.getMessage());
     }

     @Override
     public void onNext(MenuBean baseBean) {
         //成功
         mTv2.setText(baseBean.toString());
     }
 });
    }
}

使用也挺方便,直接调用请求方法,把参数和观察者传入就可以了。成功之后直接返回自己所需要的bean对象,而且还能对异常处理,什么404,405,500都能自己去处理。
同事都走了了,我也要下班了,希望能帮到各位或是提出宝贵意见。
源码下载地址:源码地址

你可能感兴趣的:(Retrofit框架)