RxJava+Retrofit+OkHttp3+Dagger2+MVP构建Android项目简单例子

以前的项目都是用的很老的MVC来做的,当然我觉得MVC在维护方面是比MVP强的,网络请求框架是用的严大神的NoHttp,个人这个网络请求框架是非常nb的,有机会看到这博客的可以去GitHub上搜一下,非常好用。最近有点时间就开始去接触最近非常流行的Android开发组合RxJava+Retrofit+OkHttp3+Dagger2+MVP,因为刚上手,所以不是很熟,都是在学习别人的东西,基本上从别人的项目中剥离出来的,在这对那些高手表示感谢。

一、用RxJava+Retrofit+OkHttp3封装成网络请求框架:
1、OkHttp3工具类封装,在okhttp中设置缓存目录、请求拦截器,响应拦截器,代码如下:

public class OkHttpUtil {
   

    private static OkHttpClient mOkHttpClient;

    //设置缓存目录
    private static final File cacheDirectory = new File(MyApplication.getMyApplication().getCacheDir().getAbsolutePath(), "httpCache");

    private static Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024);

    //请求拦截
    private static RequestInterceptor requestInterceptor = new RequestInterceptor();

    //响应拦截
    private static ResponseInterceptor responseInterceptor = new ResponseInterceptor();


    public static OkHttpClient getOkHttpClient() {
        if (null == mOkHttpClient) {
            mOkHttpClient = new OkHttpClient.Builder()
                    .cookieJar(CookieJar.NO_COOKIES)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(30, TimeUnit.SECONDS)
                    .addInterceptor(responseInterceptor)
                    .addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                        @Override
                        public void log(String message) {
                            Log.i("http", message);
                        }
                    }).setLevel(HttpLoggingInterceptor.Level.BODY))
                    .cache(cache)
                    .build();
        }
        return mOkHttpClient;
    }
}

在代码中有请求拦截器RequestInterceptor和响应拦截器ResponseInterceptor,一般的请求都需要带上请求头和一些公共的请求参数以及Cookie的管理,这些配置都是在请求拦截器中配置,而响应拦截器一般对返回的参数进行一定格式化,便于处理数据,具体见源码。这里还用okhttp中的日志拦截,这个非常厉害HttpLoggingInterceptor,可以打印出所有http请求的信息,再也不用跟你的后台小哥争论了,有详细日志有真相。

2、Retrofit工具类封装,Retrofit之所以牛逼是他可以跟RxJava完美的结合,无缝!!!具体代码如下

public abstract class RetrofitUtil {
    //服务路径
    private static final String Url = "http://hzqb.sftsdg.com/YMF_Webs/";
    private static Retrofit mRetrofit;
    private static OkHttpClient mOkHttpClient;

    //获取Retrofit对象

    protected static Retrofit getRetrofit(){
        if (null == mRetrofit){
            if (null == mOkHttpClient){
                mOkHttpClient = OkHttpUtil.getOkHttpClient();
            }
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(Url)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                    .client(mOkHttpClient)
                    .build();
        }
        return mRetrofit;
    }
}

这里是将Retrofit与OkHttp完美结合,因为Retrofit需要传入一个Request Client,此时用OkHttp再合适不过了,同时,还可以用GsonConverterFactory来自动解析数据。需要注意的是,此处的url必须要以“/”结尾,不然会抛异常

3、获取将OkHttpClient和Retrofit结合好Retrofit对象,此处,Retrofit.create()返回一个泛型,完美结合RxJava,代码如下:

public class RequestEngine {

    private static Retrofit mRetrofit;
    //private static RequestEngine instance;

    public RequestEngine() {
        mRetrofit = RetrofitUtil.getRetrofit();
    }

    /*public static RequestEngine getInstance() {
        if (instance == null) {
            synchronized (RequestEngine.class) {
                if (null == instance) {
                    instance = new RequestEngine();
                }
            }
        }
        return instance;
    }*/

    //返回一个泛型
    public <T> T getServer(Class<T> server) {
        return mRetrofit.create(server);
    }

}

代码片中注释的是用一般的方法引入的封装好的Retrofit,此处把代码注释掉是因为用到了注解Dagger2,

4、用Retrofit写请求方法,返回的是Observable泛型,代码如下:

public interface RequestApi {
   

    @FormUrlEncoded
    @POST("login/u.php")
    Observable<BaseBean<LoginInfo>> login(@Field("username") String username, @Field("password") String password, @Field("app") String type);

}

至于Retrofit一般用法还是挺简单的,简单介绍下,在retrofit中通过一个Java接口作为http请求的api接口
get请求:在方法上使用@Get注解来标志该方法为get请求,在方法中的参数需要用@Query来注释,如:

@GET("search/repositories")
Call<RetrofitBean> queryRetrofitByGetCall(@Query("q")String owner,
                                      @Query("since")String time,
                                      @Query("page")int page,
                                      @Query</
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值