美文网首页
rxjava2 + retrofit2

rxjava2 + retrofit2

作者: ff_hh | 来源:发表于2017-08-22 14:46 被阅读0次

    第一步 Android studio 项目配置

    在build.gradle 中添加以下配置

    compile ‘io.reactivex.rxjava2:rxjava:2.1.1’

    compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’

    compile ‘com.squareup.retrofit2:retrofit:2.3.0’

    compile ‘com.squareup.retrofit2:converter-gson:2.3.0’

    complie ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’

    complie ‘com.squareup.okhttp3:logging-intereceptor:3.8.0’

    注意事项 retrofit2.3.0 是基于OKHttp3.8.0 添加

    com.squareuo.okhttp3:logging-intereceptor:3.8.0

    注意版本要一致,否则运行时会失败

    第二步 retrofit 注解

    注解 retrofit通过使用注解来简化请求,大体分为以下几类:

    retrofit通过使用注解来简化请求,大体分为以下几类

    1.用于标注请求方式的注解

    2.用于标记请求头的注解

    3.用于标记请求参数的注解

    4.用于标记请求和响应格式的注解

    请求方法注解

    注解 说明

    GET get请求

    POST post请求

    PUT put请求

    DELETE delete请求

    PATCH patch请求,该请求是对put请求的补充,用于更新局部资源

    HEAD head请求

    OPTIONS option请求

    HTTP 通用注解,可以替换以上所有的注解,其拥有三个属性:method,path,hasBody

    请求头注解

    注解 说明

    Headers 用于添加固定请求头,可以同时添加多个。通过该注解添加的请求头不会相互覆盖,而是共同存在

    Header 作为方法的参数传入,用于添加不固定值的Header,该注解会更新已有的请求头

    请求参数注解

    名称 说明

    Body 多用于post请求发送非表单数据,比如想要以post方式传递json格式数据

    Filed 多用于post请求中表单字段,Filed和FieldMap需要FormUrlEncoded结合使用

    FiledMap 和@Filed作用一致,用于不确定表单参数

    Part 用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况

    PartMap 用于表单字段,默认接受的类型是Map,可用于实现多文件上传

    Path 用于url中的占位符

    Query 用于Get中指定参数

    QueryMap 和Query使用类似

    Url 指定请求路径

    请求和响应格式注解

    名称 说明

    FormUrlEncoded 表示请求发送编码表单数据,每个键值对需要使用@Field注解

    Multipart 表示请求发送multipart数据,需要配合使用@Part

    Streaming 表示响应用字节流的形式返回.如果没使用该注解,默认会把数据全部载入到内存中.该注解在在下载大文件的特别有用

    第三步 retrofit 基础类创建

    创建请求

    publicinterfaceRetrofitService{

    @POST("Account/Login")

    Observable> login(@BodyLogin login);

    @GET("Order/Query")

    Observable>>    queryOrder(@Query("page")intpage,@Query("pageSize")intpageSize,

    @Query("status")intstatus,@Query("time") String time,

    @Query("date") String date,@Query("key") String key,

    @Query("token") String token);

    }

    创建拦截器

    * 创建日志拦截器

    *

    *@return

    */

    privatestaticHttpLoggingInterceptorlogInterceptor(){

    HttpLoggingInterceptor logInterceptor =newHttpLoggingInterceptor(newHttpLoggingInterceptor.Logger(){

    @Verride

    publicvoidlog(String message){

    Log.e("OKhttp","log= "+ message);

    }

    });

    logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    returnlogInterceptor;

    }

    创建OKHttpClient

    privatestaticOkHttpClient okHttpClient =newOKHttpClient.Builder()

    //添加通用的 Header 拦截器替换原有的COOKIE 可根据需要自行添加不同拦截器

    .addInterceptor(newInterceptor(){

    @Override

    publicResponseintercept(Chain chain)throwsIOException{

    //替换原有的COOKIE

    Request request = chain.request();

    Request.Builder builder = request.newBuilder().removeHeader("COOKIE");

    builder.addHeader("COOKIE", cookie)

    returnchain.procedd(builder.build());

    }

    .addInterceptor(logInterceptor())

    .connectTimeout(30, TimeUint.SECONDS)

    .readTimeout(100, TimeUint.SECONDS)

    .build();

    })

    提供retrofit 方法调用

    RetrofitService retrofitService =newRerofit.Builder()

    .baseUrl(baseUrl)

    .addConverterFactory(GsonConverterFactory.create())

    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

    .cilent(okHttpClient)

    .build()

    .create(RetrofitService.class);

    publicstaticRetrofitServicegetInstance(){

    returnretrofitService;

    }

    接口调用

    Login login =newLogin("name","passWord");

    ObserVable> obserVable = RetrofitFactory.getInstance.login(login);

    observable.subscribeOn(Schedulers.io())

    .filter(userBaseBean -> userBaseBean.isResult())

    .map(userBaseBean -> {

    Constant.setLogUser(userBeseBean.getData());

    returnuserBaseBean.getData();

    }).observeOn(AndroidSchedulers.mainThread())

    .subscribe(userBean ->{

    startActivity(newIntetn(context, MainActivity.class));

    })

    增加通用ObserVable

    publicabstractclassBaseObserverimplementsObserver>{

    privatestaticfinalString TAG ="BaseObserver";

    privateContext mContext;

    publicBaseObserver(Context mContext){

    this.mContext = mContext;

    }

    @Override

    publicvoidonSubscribe(@NonNull Disposable d){

    }

    @Override

    publicvoidonNext(@NonNull BaseBean tBaseBean){

    if(tBaseBean.isResult()){

    onHandleSuccess(tBaseBean.getData());

    }else{

    onHandleError(tBaseBean.getMessage());

    }

    }

    @Override

    publicvoidonError(@NonNull Throwable e){

    LogUtil.e(e.toString(), BaseObserver.class);

    }

    @Override

    publicvoidonComplete(){

    LogUtil.d("onComplete()", BaseObserver.class);

    }

    protectedabstractvoidonHandleSuccess(T t);

    protectedvoidonHandleError(String msg){

    LogUtil.e(msg, getClass());

    Looper mainLooper = mContext.getMainLooper();

    newHandler(mainLooper).post(() -> {

    if(mContextinstanceofParentActivity){

    ((ParentActivity) mContext).hideLoading();

    }elseif(mContextinstanceofParentFragmentActivity)

    ((ParentFragmentActivity) mContext).hideLoading();

    FinalToast.ErrorContext(mContext, msg);

    });

    }

    }

    相关文章

      网友评论

          本文标题:rxjava2 + retrofit2

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